[PYTHON] À propos du fait que la notation d'inclusion de liste n'est plus lente dans PyPy 7.3.1

À propos du fait que la notation d'inclusion de liste n'est plus lente dans PyPy 7.3.1

J'ai presque fini ce que je veux dire dans le titre ...

[Conseils d'accélération de la programmation de la compétition Python (précautions personnelles lorsque vous utilisez Atcoder en Python)](https://juppy.hatenablog.com/entry/2019/06/14/Python_%E7%AB% B6% E6% 8A% 80% E3% 83% 97% E3% 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9F% E3% 83% B3% E3% 82% B0% E9% AB% 98% E9% 80% 9F% E5% 8C% 96tips_% 28Python% E3% 81% A7Atcoder% E3% 82% 92% E3% 82% 84% E3% 82% 8B% E9% 9A% 9B% E3% 81% AB% E5% 80% 8B # Pypy% E3% 81% 98% E3% 82% 83% E3% 81% A0% E3% 82% 81% E3% 81% AA% E3% 82% 82% Comme mentionné dans E3% 81% AE), il y avait le fait que la notation d'inclusion de liste de PyPy était lente.

À propos, [https://morepypy.blogspot.com/2020/04/pypy-731-released.html](PyPy 7.3.1 publié) a la déclaration suivante.

improved JIT code generation for generators (and generator expressions in particular) when passing them to functions like sum, map, and map that consume them.

La notation d'inclusion de liste est comme passer une expression de générateur à la fonction de liste!?

$ cat 1.py
n = 10**7

a = [0]*n
for i in range(n):
    a[i] = i*2

$ cat 2.py
n = 10**7

a = [i*2 for i in range(n)]

$ ./pypy3 --version
Python 3.6.9 (2ad108f17bdb, Apr 07 2020, 03:05:35)
[PyPy 7.3.1 with MSC v.1912 32 bit]

$ time ./pypy3.exe 1.py

real    0m0.149s
user    0m0.000s
sys     0m0.000s

$ time ./pypy3.exe 2.py

real    0m0.136s
user    0m0.015s
sys     0m0.000s

L'inclusion de liste est plus rapide !!

$ ./pypy3 --version
Python 3.6.9 (1608da62bfc7, Dec 23 2019, 12:38:24)
[PyPy 7.3.0 with MSC v.1911 32 bit]

$ time ./pypy3.exe 1.py

real    0m0.146s
user    0m0.000s
sys     0m0.015s

$ time ./pypy3.exe 2.py

real    0m0.440s
user    0m0.000s
sys     0m0.015s

L'inclusion de liste est environ 3 fois plus lente dans PyPy 7.3.0.

Malheureusement, la mise à jour du langage AtCoder est PyPy 7.3.0, n'est-ce pas?

Postscript: Il est bien vivant que l'ajout de chaînes de caractères soit désespérément lent.

$ cat 3.py
n = 10**5
res = 'a'
for _ in [0]*n:
    res += 'a'

$ time ./pypy3 3.py

real    0m1.476s
user    0m0.000s
sys     0m0.015s

$ time python3 3.py

real    0m0.082s
user    0m0.015s
sys     0m0.062s

Recommended Posts

À propos du fait que la notation d'inclusion de liste n'est plus lente dans PyPy 7.3.1
Utiliser des fonctionnalités qui ne sont plus visibles sur l'interface utilisateur de Slack
La flèche de pliage n'apparaît plus dans jupyterlab-toc
Notation d'inclusion de liste Python facile à oublier
Notez que la notation d'inclusion de liste de Python est toujours déroutante
EP 8 Évitez plus de deux expressions dans la compréhension de liste