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 |