Ten artykuł zawiera opis wyników testów wydajnościowych dla Pythona 3.11 w porównaniu do poprzedniej wersji tego języka programowania, którym jest Python 3.10. W sumie zostało przeprowadzono 87 różnych testów porównawczych na komputerach z procesorem serii AMD Ryzen 7000 oraz procesorem Intel Core 13. generacji. Jeden z nich używany jest w komputerach stacjonarnych, drugi – w laptopach lub komputerach mini PC.
Wszystkie testy zostały przeprowadzone na komputerach z systemem Windows 11 przy użyciu biblioteki pyperformance 1.0.9 w Pythonie 3.10.11 oraz Pythonie 3.11.6 (obie wersje 64-bitowe).
Procesor AMD Ryzen z serii 7000 do komputerów stacjonarnych
Pierwsza część testów obejmowała komputer stacjonarny z procesorem AMD Ryzen 9 7900, pamięcią RAM DDR5 i dyskiem M.2 PCIe Gen4 NVMe. Poniższa tabela przedstawia wyniki 87 testów przeprowadzonych przy użyciu Pythona 3.10 (jako punktu odniesienia) i Pythona 3.11 na tym urządzeniu.
Nazwa testu | Python 3.10 | Python 3.11 |
---|---|---|
2to3 | 216 ms | 191 ms (1.13x szybciej) |
async_generators | 230 ms | 198 ms (1.16x szybciej) |
async_tree_cpu_io_mixed | 685 ms | 580 ms (1.18x szybciej) |
async_tree_io | 1.32 sec | 949 ms (1.39x szybciej) |
async_tree_memoization | 560 ms | 420 ms (1.33x szybciej) |
async_tree_none | 471 ms | 340 ms (1.39x szybciej) |
asyncio_tcp | 686 ms | 708 ms (nieistotne) |
asyncio_tcp_ssl | 2.04 sec | 2.02 sec (nieistotne) |
bench_mp_pool | 55.4 ms | 54.9 ms (1.01x szybciej) |
bench_thread_pool | 725 us | 687 us (1.05x szybciej) |
chameleon | 5.89 ms | 5.23 ms (1.13x szybciej) |
chaos | 57.1 ms | 45.7 ms (1.25x szybciej) |
comprehensions | 14.6 us | 14.4 us (1.02x szybciej) |
coroutines | 17.3 ms | 16.9 ms (1.02x szybciej) |
coverage | 33.5 ms | 141 ms (4.21x wolniej) |
create_gc_cycles | 637 us | 521 us (1.22x szybciej) |
crypto_pyaes | 62.7 ms | 48.3 ms (1.30x szybciej) |
dask | 263 ms | 235 ms (1.12x szybciej) |
deepcopy | 253 us | 225 us (1.12x szybciej) |
deepcopy_memo | 28.9 us | 25.1 us (1.15x szybciej) |
deepcopy_reduce | 2.20 us | 2.02 us (1.09x szybciej) |
deltablue | 4.27 ms | 2.63 ms (1.63x szybciej) |
django_template | 28.2 ms | 23.0 ms (1.22x szybciej) |
docutils | 1.63 sec | 1.39 sec (1.18x szybciej) |
fannkuch | 256 ms | 240 ms (1.07x szybciej) |
float | 66.7 ms | 53.5 ms (1.25x szybciej) |
gc_traversal | 1.20 ms | 1.25 ms (1.04x wolniej) |
generators | 41.8 ms | 41.0 ms (nieistotne) |
genshi_text | 18.7 ms | 16.6 ms (1.13x szybciej) |
genshi_xml | 132 ms | 95.9 ms (1.07x szybciej) |
hexiom | 5.46 ms | 4.39 ms (1.25x szybciej) |
html5lib | 39.3 ms | 31.2 ms (1.26x szybciej) |
json_dumps | 8.09 ms | 7.72 ms (1.05x szybciej) |
json_loads | 13.3 us | 12.7 us (1.05x szybciej) |
logging_format | 6.74 us | 6.35 us (1.06x szybciej) |
logging_silent | 102 ns | 71.6 ns (1.43x szybciej) |
logging_simple | 6.36 us | 6.00 us (1.06x szybciej) |
mako | 9.04 ms | 7.49 ms (1.21x szybciej) |
mdp | 1.68 sec | 1.62 sec (1.04x szybciej) |
meteor_contest | 65.9 ms | 65.9 ms (nieistotne) |
nbody | 81.8 ms | 73.6 ms (1.11x szybciej) |
nqueens | 61.3 ms | 60.3 ms (nieistotne) |
pathlib | 81.3 ms | 79.9 ms (1.02x szybciej) |
pickle | 6.86 us | 6.66 us (1.03x szybciej) |
pickle_dict | 18.5 us | 18.3 us (1.01x szybciej) |
pickle_list | 2.58 us | 2.59 us (nieistotne) |
pickle_pure_python | 258 us | 191 us (1.35x szybciej) |
pidigits | 136 ms | 136 ms (nieistotne) |
pprint_pformat | 1.17 sec | 983 ms (1.19x szybciej) |
pprint_safe_repr | 568 ms | 479 ms (1.19x szybciej) |
pyflate | 387 ms | 293 ms (1.32x szybciej) |
python_startup | 17.4 ms | 15.2 ms (1.15x szybciej) |
python_startup_no_site | 13.2 ms | 12.5 ms (1.05x szybciej) |
raytrace | 275 ms | 204 ms (1.35x szybciej) |
regex_compile | 89.5 ms | 77.1 ms (1.16x szybciej) |
regex_dna | 111 ms | 103 ms (1.07x szybciej) |
regex_effbot | 1.78 ms | 1.64 ms (1.09x szybciej) |
regex_v8 | 15.0 ms | 14.7 ms (1.02x szybciej) |
richards | 41.7 ms | 29.8 ms (1.40x szybciej) |
richards_super | 50.9 ms | 37.0 ms (1.37x szybciej) |
scimark_fft | 223 ms | 214 ms (1.04x szybciej) |
scimark_lu | 94.3 ms | 68.7 ms (1.37x szybciej) |
scimark_monte_carlo | 58.1 ms | 44.2 ms (1.32x szybciej) |
scimark_sor | 105 ms | 80.4 ms (1.30x szybciej) |
scimark_sparse_mat_mult | 3.47 ms | 3.29 ms (1.05x szybciej) |
spectral_norm | 82.1 ms | 75.7 ms (1.08x szybciej) |
sqlglot_normalize | 198 ms | 178 ms (1.11x szybciej) |
sqlglot_optimize | 37.1 ms | 32.3 ms (1.15x szybciej) |
sqlglot_parse | 1.12 ms | 891 us (1.26x szybciej) |
sqlglot_transpile | 1.33 ms | 1.06 ms (1.25x szybciej) |
sqlite_synth | 1.54 us | 1.41 us (1.09x szybciej) |
sympy_expand | 265 ms | 248 ms (1.07x szybciej) |
sympy_integrate | 12.7 ms | 11.8 ms (1.07x szybciej) |
sympy_str | 162 ms | 152 ms (1.06x szybciej) |
sympy_sum | 91.4 ms | 86.4 ms (1.06x szybciej) |
telco | 3.80 ms | 3.91 ms (1.03x wolniej) |
tomli_loads | 1.69 sec | 1.46 sec (1.15x szybciej) |
tornado_http | 98.2 ms | 86.9 ms (1.13x szybciej) |
typing_runtime_protocols | 314 us | 307 us (1.02x szybciej) |
unpack_sequence | 39.3 ns | 35.1 ns (1.12x szybciej) |
unpickle | 8.59 us | 8.13 us (1.06x szybciej) |
unpickle_list | 2.87 us | 2.86 us (nieistotne) |
unpickle_pure_python | 176 us | 150 us (1.18x szybciej) |
xml_etree_generate | 55.2 ms | 53.6 ms (1.03x szybciej) |
xml_etree_iterparse | 57.6 ms | 60.0 ms (1.04x wolniej) |
xml_etree_parse | 83.4 ms | 82.3 ms (1.01x szybciej) |
xml_etree_process | 44.4 ms | 38.4 ms (1.16x szybciej) |
Wynik (średnia geometryczna) | 1.11x szybciej |
Przeprowadzona analiza wskazuje na to, że Python 3.11 ma najlepsze wyniki wydajnościowe w porównaniu do Pythona 3.10 w następujących testach: deltablue (1.63x szybciej), logging_silent (1.43x szybciej), richards (1.40x szybciej). Można jednak zauważyć spadek wydajności w niektórych testach, szczególnie w coverage (4.21x wolniej), sqlglot_parse (1.26x szybciej), gc_traversal (1.04x wolniej).
Dodatkowo można sprawdzić różnice w wydajności pomiędzy Pythonem 3.11 i Pythonem 3.10 w oparciu o testy należące do określonych grup. Poniższa tabela przedstawia średnią geometryczną dla testów porównawczych w ramach poszczególnych grup dla Pythona 3.11 w porównaniu z Pythonem 3.10.
Grupa testów | Python 3.11 w porównaniu do Pythona 3.10 |
---|---|
apps | 1.16x szybciej |
asyncio | 1.32x szybciej |
math | 1.12x szybciej |
regex | 1.08x szybciej |
serialize | 1.07x szybciej |
startup | 1.10x szybciej |
template | 1.16x szybciej |
Procesor Intel Core 13. generacji dla urządzeń mobilnych
Druga część testów obejmowała komputer mini PC z procesorem Intel Core i3-1315U (który jest również używany w laptopach), pamięcią RAM DDR4 i dyskiem M.2 PCIe Gen4 NVMe. Poniższa tabela przedstawia wyniki 87 testów przeprowadzonych przy użyciu Pythona 3.10 (jako punktu odniesienia) i Pythona 3.11 na tym urządzeniu.
Nazwa testu | Python 3.10 | Python 3.11 |
---|---|---|
2to3 | 282 ms | 250 ms (1.13x szybciej) |
async_generators | 254 ms | 208 ms (1.22x szybciej) |
async_tree_cpu_io_mixed | 716 ms | 615 ms (1.16x szybciej) |
async_tree_io | 1.16 sec | 864 ms (1.34x szybciej) |
async_tree_memoization | 593 ms | 463 ms (1.28x szybciej) |
async_tree_none | 486 ms | 373 ms (1.30x szybciej) |
asyncio_tcp | 981 ms | 966 ms (nieistotne) |
asyncio_tcp_ssl | 2.43 sec | 3.22 sec (1.33x wolniej) |
bench_mp_pool | 89.5 ms | 87.2 ms (1.03x szybciej) |
bench_thread_pool | 1.24 ms | 1.13 ms (1.09x szybciej) |
chameleon | 6.47 ms | 6.01 ms (1.08x szybciej) |
chaos | 68.8 ms | 55.7 ms (1.24x szybciej) |
comprehensions | 18.4 us | 18.4 us (nieistotne) |
coroutines | 18.0 ms | 16.8 ms (1.07x szybciej) |
coverage | 33.0 ms | 163 ms (4.95x wolniej) |
create_gc_cycles | 888 us | 799 us (1.11x szybciej) |
crypto_pyaes | 70.3 ms | 54.9 ms (1.28x szybciej) |
dask | 431 ms | 379 ms (1.14x szybciej) |
deepcopy | 293 us | 282 us (1.04x szybciej) |
deepcopy_memo | 32.0 us | 28.9 us (1.11x szybciej) |
deepcopy_reduce | 2.47 us | 2.35 us (1.05x szybciej) |
deltablue | 4.71 ms | 3.02 ms (1.56x szybciej) |
django_template | 33.3 ms | 27.6 ms (1.21x szybciej) |
docutils | 2.19 sec | 1.86 sec (1.18x szybciej) |
fannkuch | 306 ms | 283 ms (1.08x szybciej) |
float | 70.0 ms | 62.2 ms (1.13x szybciej) |
gc_traversal | 1.69 ms | 1.80 ms (1.07x wolniej) |
generators | 36.0 ms | 38.2 ms (1.06x wolniej) |
genshi_text | 21.6 ms | 19.5 ms (1.11x szybciej) |
genshi_xml | 153 ms | 118 ms (1.05x szybciej) |
hexiom | 6.22 ms | 5.19 ms (1.20x szybciej) |
html5lib | 56.0 ms | 45.5 ms (1.23x szybciej) |
json_dumps | 9.76 ms | 8.76 ms (1.11x szybciej) |
json_loads | 16.0 us | 16.3 us (1.02x wolniej) |
logging_format | 8.15 us | 7.67 us (1.06x szybciej) |
logging_silent | 106 ns | 81.4 ns (1.30x szybciej) |
logging_simple | 7.60 us | 7.25 us (1.05x szybciej) |
mako | 9.78 ms | 8.19 ms (1.19x szybciej) |
mdp | 1.96 sec | 1.93 sec (1.01x szybciej) |
meteor_contest | 83.7 ms | 85.9 ms (1.03x wolniej) |
nbody | 80.5 ms | 82.0 ms (nieistotne) |
nqueens | 75.9 ms | 73.8 ms (1.03x szybciej) |
pathlib | 77.5 ms | 73.4 ms (1.06x szybciej) |
pickle | 7.85 us | 7.71 us (1.02x szybciej) |
pickle_dict | 20.9 us | 22.0 us (1.05x wolniej) |
pickle_list | 3.11 us | 3.23 us (1.04x wolniej) |
pickle_pure_python | 302 us | 229 us (1.32x szybciej) |
pidigits | 167 ms | 169 ms (1.01x wolniej) |
pprint_pformat | 1.39 sec | 1.19 sec (1.17x szybciej) |
pprint_safe_repr | 676 ms | 581 ms (1.16x szybciej) |
pyflate | 461 ms | 359 ms (1.28x szybciej) |
python_startup | 25.0 ms | 23.1 ms (1.08x szybciej) |
python_startup_no_site | 19.4 ms | 19.8 ms (1.02x wolniej) |
raytrace | 320 ms | 233 ms (1.38x szybciej) |
regex_compile | 118 ms | 102 ms (1.16x szybciej) |
regex_dna | 148 ms | 136 ms (1.09x szybciej) |
regex_effbot | 1.88 ms | 1.72 ms (1.10x szybciej) |
regex_v8 | 17.0 ms | 15.5 ms (1.10x szybciej) |
richards | 46.6 ms | 35.0 ms (1.33x szybciej) |
richards_super | 58.5 ms | 43.1 ms (1.36x szybciej) |
scimark_fft | 214 ms | 212 ms (1.01x szybciej) |
scimark_lu | 93.7 ms | 71.5 ms (1.31x szybciej) |
scimark_monte_carlo | 64.1 ms | 53.3 ms (1.20x szybciej) |
scimark_sor | 114 ms | 87.5 ms (1.30x szybciej) |
scimark_sparse_mat_mult | 2.97 ms | 2.97 ms (nieistotne) |
spectral_norm | 84.8 ms | 77.2 ms (1.10x szybciej) |
sqlglot_normalize | 234 ms | 219 ms (1.07x szybciej) |
sqlglot_optimize | 44.8 ms | 40.6 ms (1.10x szybciej) |
sqlglot_parse | 1.40 ms | 1.07 ms (1.30x szybciej) |
sqlglot_transpile | 1.67 ms | 1.31 ms (1.28x szybciej) |
sqlite_synth | 2.16 us | 1.97 us (1.10x szybciej) |
sympy_expand | 367 ms | 350 ms (1.05x szybciej) |
sympy_integrate | 17.4 ms | 15.9 ms (1.09x szybciej) |
sympy_str | 223 ms | 215 ms (1.04x szybciej) |
sympy_sum | 124 ms | 118 ms (1.05x szybciej) |
telco | 4.42 ms | 4.60 ms (1.04x wolniej) |
tomli_loads | 1.89 sec | 1.60 sec (1.18x szybciej) |
tornado_http | 140 ms | 116 ms (1.20x szybciej) |
typing_runtime_protocols | 378 us | 377 us (nieistotne) |
unpack_sequence | 44.9 ns | 52.6 ns (1.17x wolniej) |
unpickle | 9.21 us | 9.04 us (1.02x szybciej) |
unpickle_list | 3.16 us | 2.99 us (1.06x szybciej) |
unpickle_pure_python | 209 us | 173 us (1.21x szybciej) |
xml_etree_generate | 61.8 ms | 62.2 ms (nieistotne) |
xml_etree_iterparse | 74.4 ms | 75.5 ms (1.01x wolniej) |
xml_etree_parse | 114 ms | 116 ms (1.02x wolniej) |
xml_etree_process | 49.5 ms | 42.7 ms (1.16x szybciej) |
Wynik (średnia geometryczna) | 1.09x szybciej |
Przeprowadzona analiza wskazuje na to, że Python 3.11 ma najlepsze wyniki wydajnościowe w porównaniu do Pythona 3.10 w następujących testach: deltablue (1.56x szybciej), raytrace (1.38x szybciej), richards_super (1.36x szybciej). Można jednak zauważyć spadek wydajności w niektórych testach, szczególnie w coverage (4.95x wolniej), asyncio_tcp_ssl (1.33x wolniej), unpack_sequence (1.17x wolniej).
Dodatkowo można sprawdzić różnice w wydajności pomiędzy Pythonem 3.11 i Pythonem 3.10 w oparciu o testy należące do określonych grup. Poniższa tabela przedstawia średnią geometryczną dla testów porównawczych w ramach poszczególnych grup dla Pythona 3.11 w porównaniu z Pythonem 3.10.
Grupa testów | Python 3.11 w porównaniu do Pythona 3.10 |
---|---|
apps | 1.16x szybciej |
asyncio | 1.27x szybciej |
math | 1.03x szybciej |
regex | 1.11x szybciej |
serialize | 1.06x szybciej |
startup | 1.03x szybciej |
template | 1.14x szybciej |