Python 3.11 kontra Python 3.12 – test wydajności

W ramach tego artykułu zostały opisane wyniki testów wydajnościowych dla Pythona 3.12 w porównaniu z Pythonem 3.11. W sumie zostało przeprowadzono 91 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.11.6 oraz Pythonie 3.12.0 (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 91 testów przeprowadzonych przy użyciu Pythona 3.11 (jako punktu odniesienia) i Pythona 3.12 na tym urządzeniu.

Nazwa testu Python 3.11 Python 3.12
2to3 191 ms 202 ms (1.06x wolniej)
async_generators 198 ms 268 ms (1.35x wolniej)
async_tree_cpu_io_mixed 580 ms 516 ms (1.12x szybciej)
async_tree_cpu_io_mixed_tg 521 ms 512 ms (1.02x szybciej)
async_tree_io 949 ms 864 ms (1.10x szybciej)
async_tree_io_tg 930 ms 892 ms (1.04x szybciej)
async_tree_memoization 420 ms 386 ms (1.09x szybciej)
async_tree_memoization_tg 394 ms 378 ms (1.04x szybciej)
async_tree_none 340 ms 316 ms (1.07x szybciej)
async_tree_none_tg 300 ms 292 ms (1.03x szybciej)
asyncio_tcp 708 ms 476 ms (1.49x szybciej)
asyncio_tcp_ssl 2.02 sec 1.90 sec (1.07x szybciej)
bench_mp_pool 54.9 ms 63.8 ms (1.16x wolniej)
bench_thread_pool 687 us 694 us (1.01x wolniej)
chameleon 5.23 ms 5.25 ms (nieistotne)
chaos 45.7 ms 45.5 ms (nieistotne)
comprehensions 14.4 us 14.3 us (nieistotne)
coroutines 16.9 ms 16.9 ms (nieistotne)
coverage 141 ms 239 ms (1.69x wolniej)
create_gc_cycles 521 us 537 us (1.03x wolniej)
crypto_pyaes 48.3 ms 49.6 ms (1.03x wolniej)
dask 235 ms 241 ms (1.03x wolniej)
deepcopy 225 us 229 us (1.02x wolniej)
deepcopy_memo 25.1 us 26.1 us (1.04x wolniej)
deepcopy_reduce 2.02 us 2.11 us (1.05x wolniej)
deltablue 2.63 ms 2.48 ms (1.06x szybciej)
django_template 23.0 ms 23.4 ms (1.02x wolniej)
docutils 1.39 sec 1.46 sec (1.05x wolniej)
fannkuch 240 ms 254 ms (1.06x wolniej)
float 53.5 ms 59.6 ms (1.11x wolniej)
gc_traversal 1.25 ms 1.26 ms (1.01x wolniej)
generators 41.0 ms 26.6 ms (1.55x szybciej)
genshi_text 16.6 ms 16.2 ms (1.03x szybciej)
genshi_xml 95.9 ms 97.9 ms (1.03x szybciej)
hexiom 4.39 ms 4.57 ms (1.04x wolniej)
html5lib 31.2 ms 33.3 ms (1.07x wolniej)
json_dumps 7.72 ms 5.77 ms (1.34x szybciej)
json_loads 12.7 us 13.5 us (1.06x wolniej)
logging_format 6.35 us 6.62 us (1.04x wolniej)
logging_silent 71.6 ns 70.5 ns (1.02x szybciej)
logging_simple 6.00 us 6.24 us (1.04x wolniej)
mako 7.49 ms 7.76 ms (1.04x wolniej)
mdp 1.62 sec 1.62 sec (nieistotne)
meteor_contest 65.9 ms 67.4 ms (1.02x wolniej)
nbody 73.6 ms 87.0 ms (1.18x wolniej)
nqueens 60.3 ms 61.7 ms (1.02x wolniej)
pathlib 79.9 ms 91.9 ms (1.15x wolniej)
pickle 6.66 us 7.11 us (1.07x wolniej)
pickle_dict 18.3 us 18.9 us (1.03x wolniej)
pickle_list 2.59 us 2.73 us (1.05x wolniej)
pickle_pure_python 191 us 198 us (1.03x wolniej)
pidigits 136 ms 138 ms (1.02x wolniej)
pprint_pformat 983 ms 1.03 sec (1.04x wolniej)
pprint_safe_repr 479 ms 506 ms (1.06x wolniej)
pyflate 293 ms 315 ms (1.07x wolniej)
python_startup 15.2 ms 15.6 ms (1.02x wolniej)
python_startup_no_site 12.5 ms 13.1 ms (1.04x wolniej)
raytrace 204 ms 210 ms (1.03x wolniej)
regex_compile 77.1 ms 83.1 ms (1.08x wolniej)
regex_dna 103 ms 103 ms (nieistotne)
regex_effbot 1.64 ms 1.74 ms (1.06x wolniej)
regex_v8 14.7 ms 14.4 ms (1.03x szybciej)
richards 29.8 ms 31.2 ms (1.05x wolniej)
richards_super 37.0 ms 34.6 ms (1.07x szybciej)
scimark_fft 214 ms 220 ms (1.03x wolniej)
scimark_lu 68.7 ms 75.3 ms (1.10x wolniej)
scimark_monte_carlo 44.2 ms 48.3 ms (1.09x wolniej)
scimark_sor 80.4 ms 91.7 ms (1.14x wolniej)
scimark_sparse_mat_mult 3.29 ms 3.32 ms (nieistotne)
spectral_norm 75.7 ms 84.7 ms (1.12x wolniej)
sqlglot_normalize 178 ms 186 ms (1.04x wolniej)
sqlglot_optimize 32.3 ms 33.9 ms (1.05x wolniej)
sqlglot_parse 891 us 861 us (1.04x szybciej)
sqlglot_transpile 1.06 ms 1.05 ms (nieistotne)
sqlite_synth 1.41 us 1.49 us (1.06x wolniej)
sympy_expand 248 ms 247 ms (1.00x szybciej)
sympy_integrate 11.8 ms 11.8 ms (nieistotne)
sympy_str 152 ms 154 ms (1.01x wolniej)
sympy_sum 86.4 ms 83.3 ms (1.04x szybciej)
telco 3.91 ms 4.26 ms (1.09x wolniej)
tomli_loads 1.46 sec 1.53 sec (1.04x wolniej)
tornado_http 86.9 ms 86.2 ms (1.01x szybciej)
typing_runtime_protocols 307 us 102 us (2.99x szybciej)
unpack_sequence 35.1 ns 53.4 ns (1.52x wolniej)
unpickle 8.13 us 8.54 us (1.05x wolniej)
unpickle_list 2.86 us 2.80 us (1.02x szybciej)
unpickle_pure_python 150 us 149 us (1.01x szybciej)
xml_etree_generate 53.6 ms 60.4 ms (1.13x wolniej)
xml_etree_iterparse 60.0 ms 59.1 ms (1.02x szybciej)
xml_etree_parse 82.3 ms 78.4 ms (1.05x szybciej)
xml_etree_process 38.4 ms 42.3 ms (1.10x wolniej)
Wynik (średnia geometryczna) 1.01x wolniej

Przeprowadzona analiza wskazuje na to, że Python 3.12 ma najlepsze wyniki wydajnościowe w porównaniu do Pythona 3.11 w następujących testach: typing_runtime_protocols (2.99x szybciej), generators (1.55x szybciej), asyncio_tcp (1.49x szybciej). Można jednak zauważyć spadek wydajności w niektórych testach, szczególnie w coverage (1.69x wolniej), unpack_sequence (1.52x wolniej), async_generators (1.35x wolniej).

Dodatkowo można sprawdzić różnice w wydajności pomiędzy Pythonem 3.12 i Pythonem 3.11 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.12 w porównaniu z Pythonem 3.11.

Grupa testów Python 3.12 w porównaniu do Pythona 3.11
apps 1.03x wolniej
asyncio 1.06x szybciej
math 1.10x wolniej
regex 1.03x wolniej
serialize 1.01x wolniej
startup 1.03x wolniej
template 1.00x 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 91 testów przeprowadzonych przy użyciu Pythona 3.11 (jako punktu odniesienia) i Pythona 3.12 na tym urządzeniu.

Nazwa testu Python 3.11 Python 3.12
2to3 250 ms 256 ms (1.03x wolniej)
async_generators 208 ms 269 ms (1.29x wolniej)
async_tree_cpu_io_mixed 615 ms 558 ms (1.10x szybciej)
async_tree_cpu_io_mixed_tg 566 ms 562 ms (nieistotne)
async_tree_io 864 ms 793 ms (1.09x szybciej)
async_tree_io_tg 859 ms 805 ms (1.07x szybciej)
async_tree_memoization 463 ms 404 ms (1.15x szybciej)
async_tree_memoization_tg 432 ms 415 ms (1.04x szybciej)
async_tree_none 373 ms 334 ms (1.12x szybciej)
async_tree_none_tg 340 ms 322 ms (1.06x szybciej)
asyncio_tcp 966 ms 707 ms (1.37x szybciej)
asyncio_tcp_ssl 3.22 sec 2.24 sec (1.44x szybciej)
bench_mp_pool 87.2 ms 96.7 ms (1.11x wolniej)
bench_thread_pool 1.13 ms 1.18 ms (nieistotne)
chameleon 6.01 ms 5.87 ms (1.02x szybciej)
chaos 55.7 ms 50.8 ms (1.10x szybciej)
comprehensions 18.4 us 16.5 us (1.12x szybciej)
coroutines 16.8 ms 16.3 ms (1.03x szybciej)
coverage 163 ms 267 ms (1.63x wolniej)
create_gc_cycles 799 us 782 us (1.02x szybciej)
crypto_pyaes 54.9 ms 54.2 ms (1.01x szybciej)
dask 379 ms 366 ms (1.04x szybciej)
deepcopy 282 us 269 us (1.05x szybciej)
deepcopy_memo 28.9 us 28.0 us (1.03x szybciej)
deepcopy_reduce 2.35 us 2.40 us (1.02x wolniej)
deltablue 3.02 ms 2.46 ms (1.23x szybciej)
django_template 27.6 ms 26.6 ms (1.04x szybciej)
docutils 1.86 sec 1.90 sec (1.02x wolniej)
fannkuch 283 ms 281 ms (1.01x szybciej)
float 62.2 ms 62.4 ms (nieistotne)
gc_traversal 1.80 ms 1.85 ms (1.02x wolniej)
generators 38.2 ms 25.7 ms (1.49x szybciej)
genshi_text 19.5 ms 18.5 ms (1.06x szybciej)
genshi_xml 118 ms 103 ms (1.06x szybciej)
hexiom 5.19 ms 4.74 ms (1.10x szybciej)
html5lib 45.5 ms 43.6 ms (1.04x szybciej)
json_dumps 8.76 ms 6.54 ms (1.34x szybciej)
json_loads 16.3 us 15.9 us (1.03x szybciej)
logging_format 7.67 us 7.40 us (1.04x szybciej)
logging_silent 81.4 ns 70.5 ns (1.16x szybciej)
logging_simple 7.25 us 6.83 us (1.06x szybciej)
mako 8.19 ms 7.76 ms (1.06x szybciej)
mdp 1.93 sec 1.81 sec (1.07x szybciej)
meteor_contest 85.9 ms 88.9 ms (1.03x wolniej)
nbody 82.0 ms 88.4 ms (1.08x wolniej)
nqueens 73.8 ms 70.9 ms (1.04x szybciej)
pathlib 73.4 ms 99.6 ms (1.36x wolniej)
pickle 7.71 us 8.56 us (1.11x wolniej)
pickle_dict 22.0 us 22.4 us (1.02x wolniej)
pickle_list 3.23 us 3.38 us (1.05x wolniej)
pickle_pure_python 229 us 229 us (nieistotne)
pidigits 169 ms 171 ms (1.01x wolniej)
pprint_pformat 1.19 sec 1.23 sec (1.03x wolniej)
pprint_safe_repr 581 ms 604 ms (1.04x wolniej)
pyflate 359 ms 352 ms (1.02x szybciej)
python_startup 23.1 ms 22.5 ms (1.03x szybciej)
python_startup_no_site 19.8 ms 19.4 ms (1.02x szybciej)
raytrace 233 ms 225 ms (1.03x szybciej)
regex_compile 102 ms 101 ms (1.02x szybciej)
regex_dna 136 ms 134 ms (1.01x szybciej)
regex_effbot 1.72 ms 1.81 ms (1.05x wolniej)
regex_v8 15.5 ms 16.0 ms (1.03x wolniej)
richards 35.0 ms 31.2 ms (1.12x szybciej)
richards_super 43.1 ms 35.2 ms (1.22x szybciej)
scimark_fft 212 ms 207 ms (1.02x szybciej)
scimark_lu 71.5 ms 69.9 ms (1.02x szybciej)
scimark_monte_carlo 53.3 ms 50.9 ms (1.05x szybciej)
scimark_sor 87.5 ms 94.6 ms (1.08x wolniej)
scimark_sparse_mat_mult 2.97 ms 2.89 ms (1.03x szybciej)
spectral_norm 77.2 ms 74.3 ms (1.04x szybciej)
sqlglot_normalize 219 ms 212 ms (1.03x szybciej)
sqlglot_optimize 40.6 ms 38.9 ms (1.04x szybciej)
sqlglot_parse 1.07 ms 937 us (1.15x szybciej)
sqlglot_transpile 1.31 ms 1.18 ms (1.11x szybciej)
sqlite_synth 1.97 us 2.00 us (1.02x wolniej)
sympy_expand 350 ms 320 ms (1.09x szybciej)
sympy_integrate 15.9 ms 14.9 ms (1.07x szybciej)
sympy_str 215 ms 199 ms (1.08x szybciej)
sympy_sum 118 ms 104 ms (1.14x szybciej)
telco 4.60 ms 4.80 ms (1.04x wolniej)
tomli_loads 1.60 sec 1.59 sec (nieistotne)
tornado_http 116 ms 116 ms (nieistotne)
typing_runtime_protocols 377 us 116 us (3.25x szybciej)
unpack_sequence 52.6 ns 48.7 ns (1.08x szybciej)
unpickle 9.04 us 9.69 us (1.07x wolniej)
unpickle_list 2.99 us 3.08 us (1.03x wolniej)
unpickle_pure_python 173 us 160 us (1.08x szybciej)
xml_etree_generate 62.2 ms 66.0 ms (1.06x wolniej)
xml_etree_iterparse 75.5 ms 72.4 ms (1.04x szybciej)
xml_etree_parse 116 ms 104 ms (1.11x szybciej)
xml_etree_process 42.7 ms 45.1 ms (1.06x wolniej)
Wynik (średnia geometryczna) 1.05x szybciej

Przeprowadzona analiza wskazuje na to, że Python 3.12 ma najlepsze wyniki wydajnościowe w porównaniu do Pythona 3.11 w następujących testach: typing_runtime_protocols (3.25x szybciej), generators (1.49x szybciej), asyncio_tcp_ssl (1.44x szybciej). Można jednak zauważyć spadek wydajności w niektórych testach, szczególnie w coverage (1.63x wolniej), pathlib (1.36x wolniej), async_generators (1.29x wolniej).

Dodatkowo można sprawdzić różnice w wydajności pomiędzy Pythonem 3.12 i Pythonem 3.11 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.12 w porównaniu z Pythonem 3.11.

Grupa testów Python 3.12 w porównaniu do Pythona 3.11
apps 1.00x szybciej
asyncio 1.08x szybciej
math 1.03x wolniej
regex 1.02x wolniej
serialize 1.01x szybciej
startup 1.02x szybciej
template 1.05x szybciej
Polski
English
Русский