[PYTHON] Über die Tatsache, dass die Notation der Listeneinbeziehung in PyPy 7.3.1 nicht mehr langsam ist

Über die Tatsache, dass die Notation der Listeneinbeziehung in PyPy 7.3.1 nicht mehr langsam ist

Ich bin fast fertig mit dem, was ich im Titel sagen möchte ...

[Tipps zur Beschleunigung der Programmierung von Python-Wettbewerben (persönliche Vorsichtsmaßnahmen beim Ausführen von Atcoder in 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% Wie in E3% 81% AE) erwähnt, war die Notation der PyPy-Liste langsam.

Übrigens hat [https://morepypy.blogspot.com/2020/04/pypy-731-released.html](PyPy 7.3.1 veröffentlicht) die folgende Aussage.

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

Die Notation der Listeneinbeziehung ist wie das Übergeben eines Generatorausdrucks an die Listenfunktion !?

$ 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

Listeneinschluss ist schneller !!

$ ./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

Die Aufnahme von Listen ist in PyPy 7.3.0 etwa dreimal langsamer.

Leider ist das AtCoder-Sprachupdate PyPy 7.3.0, nicht wahr?

Nachtrag: Es ist lebendig und gut, dass das Hinzufügen von Zeichenketten hoffnungslos langsam ist.

$ 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

Über die Tatsache, dass die Notation der Listeneinbeziehung in PyPy 7.3.1 nicht mehr langsam ist
Verwenden Sie Funktionen, die auf der Benutzeroberfläche in Slack nicht mehr sichtbar sind
Der Faltpfeil wird in jupyterlab-toc nicht mehr angezeigt
Python-Listeneinschlussnotation, die leicht zu vergessen ist
Beachten Sie, dass die Listeneinschlussnotation von Python immer verwirrend ist
EP 8 Vermeiden Sie mehr als zwei Ausdrücke in Listenverständnissen