Python 3.10 kontra Python 3.11 – test wydajności

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
Polski
English
Русский