Python 3.12 kontra Python 3.13 – test wydajności

W tym artykule zostały opisane wyniki testów wydajnościowych dla Pythona 3.13 w porównaniu do poprzedniej wersji tego języka programowania, którym jest Python 3.12. W sumie zostało przeprowadzono 100 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.11.0 w Pythonie 3.12.7 oraz Pythonie 3.13.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 100 testów przeprowadzonych przy użyciu Pythona 3.12 (jako punktu odniesienia) i Pythona 3.13 na tym urządzeniu.

Nazwa testu Python 3.12 Python 3.13
2to3 226 ms 217 ms (1.04x szybciej)
async_generators 262 ms 256 ms (1.02x szybciej)
async_tree_cpu_io_mixed 514 ms 411 ms (1.25x szybciej)
async_tree_cpu_io_mixed_tg 508 ms 393 ms (1.29x szybciej)
async_tree_eager 70.9 ms 73.4 ms (1.04x wolniej)
async_tree_eager_cpu_io_mixed 303 ms 312 ms (1.03x wolniej)
async_tree_eager_cpu_io_mixed_tg 278 ms 281 ms (nieznacznie)
async_tree_eager_io 982 ms 636 ms (1.54x szybciej)
async_tree_eager_io_tg 969 ms 600 ms (1.61x szybciej)
async_tree_eager_memoization 170 ms 174 ms (1.03x wolniej)
async_tree_eager_memoization_tg 138 ms 140 ms (1.01x wolniej)
async_tree_eager_tg 49.0 ms 49.0 ms (nieznacznie)
async_tree_io 852 ms 562 ms (1.52x szybciej)
async_tree_io_tg 865 ms 562 ms (1.54x szybciej)
async_tree_memoization 374 ms 290 ms (1.29x szybciej)
async_tree_memoization_tg 369 ms 307 ms (1.20x szybciej)
async_tree_none 310 ms 233 ms (1.33x szybciej)
async_tree_none_tg 284 ms 214 ms (1.32x szybciej)
asyncio_tcp 461 ms 451 ms (1.02x szybciej)
asyncio_tcp_ssl 1.88 sec 1.47 sec (1.28x szybciej)
bench_mp_pool 77.3 ms 77.7 ms (1.01x wolniej)
bench_thread_pool 692 us 667 us (1.04x szybciej)
chameleon 5.43 ms 4.90 ms (1.11x szybciej)
chaos 45.7 ms 39.4 ms (1.16x szybciej)
comprehensions 13.7 us 10.0 us (1.37x szybciej)
coroutines 15.7 ms 14.3 ms (1.10x szybciej)
coverage 35.4 ms 48.3 ms (1.36x wolniej)
create_gc_cycles 538 us 609 us (1.13x wolniej)
crypto_pyaes 51.6 ms 48.6 ms (1.06x szybciej)
dask 236 ms 248 ms (1.05x wolniej)
deepcopy 224 us 215 us (1.04x szybciej)
deepcopy_memo 25.8 us 23.6 us (1.09x szybciej)
deepcopy_reduce 2.08 us 2.00 us (1.04x szybciej)
deltablue 2.56 ms 2.15 ms (1.19x szybciej)
django_template 23.0 ms 22.6 ms (1.02x szybciej)
docutils 1.46 sec 1.40 sec (1.05x szybciej)
dulwich_log 49.6 ms 46.5 ms (1.07x szybciej)
fannkuch 258 ms 252 ms (nieznacznie)
float 59.1 ms 54.2 ms (1.09x szybciej)
gc_traversal 1.23 ms 1.28 ms (1.03x wolniej)
generators 24.6 ms 19.9 ms (1.24x szybciej)
genshi_text 15.5 ms 15.6 ms (nieznacznie)
genshi_xml 92.3 ms 89.3 ms (1.01x szybciej)
hexiom 4.56 ms 4.01 ms (1.14x szybciej)
html5lib 32.9 ms 32.0 ms (1.03x szybciej)
json_dumps 5.71 ms 5.79 ms (1.01x wolniej)
json_loads 13.6 us 14.1 us (1.04x wolniej)
logging_format 6.66 us 5.92 us (1.12x szybciej)
logging_silent 68.2 ns 63.3 ns (1.08x szybciej)
logging_simple 6.29 us 5.46 us (1.15x szybciej)
mako 7.56 ms 6.79 ms (1.11x szybciej)
mdp 1.61 sec 1.60 sec (nieznacznie)
meteor_contest 67.3 ms 67.4 ms (nieznacznie)
nbody 86.1 ms 78.3 ms (1.10x szybciej)
nqueens 65.3 ms 58.0 ms (1.13x szybciej)
pathlib 230 ms 226 ms (1.02x szybciej)
pickle 7.43 us 7.41 us (nieznacznie)
pickle_dict 19.8 us 19.2 us (1.03x szybciej)
pickle_list 2.85 us 2.67 us (1.07x szybciej)
pickle_pure_python 199 us 178 us (1.12x szybciej)
pidigits 138 ms 135 ms (1.02x szybciej)
pprint_pformat 1.02 sec 998 ms (1.02x szybciej)
pprint_safe_repr 500 ms 488 ms (1.02x szybciej)
pyflate 322 ms 299 ms (1.08x szybciej)
python_startup 29.4 ms 30.7 ms (1.04x wolniej)
python_startup_no_site 31.8 ms 33.2 ms (1.05x wolniej)
raytrace 202 ms 171 ms (1.18x szybciej)
regex_compile 82.2 ms 71.1 ms (1.16x szybciej)
regex_dna 101 ms 103 ms (1.03x wolniej)
regex_effbot 1.79 ms 1.83 ms (1.02x wolniej)
regex_v8 14.3 ms 16.1 ms (1.13x wolniej)
richards 28.5 ms 28.7 ms (1.01x wolniej)
richards_super 32.0 ms 32.3 ms (1.01x wolniej)
scimark_fft 226 ms 209 ms (1.08x szybciej)
scimark_lu 76.9 ms 68.7 ms (1.12x szybciej)
scimark_monte_carlo 49.0 ms 44.7 ms (1.10x szybciej)
scimark_sor 92.5 ms 80.6 ms (1.15x szybciej)
scimark_sparse_mat_mult 3.55 ms 3.16 ms (1.13x szybciej)
spectral_norm 77.6 ms 70.4 ms (1.10x szybciej)
sqlglot_normalize 181 ms 170 ms (1.06x szybciej)
sqlglot_optimize 33.4 ms 32.2 ms (1.04x szybciej)
sqlglot_parse 866 us 781 us (1.11x szybciej)
sqlglot_transpile 1.05 ms 949 us (1.11x szybciej)
sqlite_synth 1.54 us 1.47 us (1.05x szybciej)
sympy_expand 249 ms 246 ms (1.01x szybciej)
sympy_integrate 11.6 ms 11.0 ms (1.06x szybciej)
sympy_str 155 ms 143 ms (1.08x szybciej)
sympy_sum 83.0 ms 75.1 ms (1.11x szybciej)
telco 4.40 ms 4.87 ms (1.11x wolniej)
tomli_loads 1.51 sec 1.40 sec (1.08x szybciej)
tornado_http 97.1 ms 91.7 ms (1.06x szybciej)
typing_runtime_protocols 105 us 97.6 us (1.08x szybciej)
unpack_sequence 53.5 ns 45.5 ns (1.17x szybciej)
unpickle 9.02 us 9.14 us (1.01x wolniej)
unpickle_list 3.19 us 2.75 us (1.16x szybciej)
unpickle_pure_python 153 us 134 us (1.14x szybciej)
xml_etree_generate 59.8 ms 57.0 ms (1.05x szybciej)
xml_etree_iterparse 58.7 ms 55.3 ms (1.06x szybciej)
xml_etree_parse 82.7 ms 76.6 ms (1.08x szybciej)
xml_etree_process 41.4 ms 39.6 ms (1.05x szybciej)
Wynik (średnia geometryczna) 1.08x szybciej

Przeprowadzona analiza wskazuje na to, że Python 3.13 ma najlepsze wyniki wydajnościowe w porównaniu do Pythona 3.12 w następujących testach: async_tree_eager_io_tg (1.61x szybciej), async_tree_eager_io (1.54x szybciej), async_tree_io_tg (1.54x szybciej). Można jednak zauważyć spadek wydajności w niektórych testach, szczególnie w coverage (1.36x wolniej), create_gc_cycles (1.13x wolniej), regex_v8 (1.13x wolniej).

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

Grupa testów Python 3.13 w porównaniu do Pythona 3.12
apps 1.06x szybciej
asyncio 1.22x szybciej
math 1.07x szybciej
regex nieznacznie
serialize 1.05x szybciej
startup 1.04x wolniej
template 1.03x 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 98 testów przeprowadzonych przy użyciu Pythona 3.12 (jako punktu odniesienia) i Pythona 3.13 na tym urządzeniu. Test „dask” został pominięty, dlatego że nie udało się go uruchomić na tej konfiguracji w wersji Pythona 3.13.

Nazwa testu Python 3.12 Python 3.13
2to3 260 ms 256 ms (1.01x szybciej)
async_generators 253 ms 251 ms (1.01x szybciej)
async_tree_cpu_io_mixed 544 ms 428 ms (1.27x szybciej)
async_tree_cpu_io_mixed_tg 546 ms 412 ms (1.33x szybciej)
async_tree_eager 78.7 ms 83.9 ms (1.07x wolniej)
async_tree_eager_cpu_io_mixed 343 ms 336 ms (1.02x szybciej)
async_tree_eager_cpu_io_mixed_tg 307 ms 301 ms (1.02x szybciej)
async_tree_eager_io 818 ms 584 ms (1.40x szybciej)
async_tree_eager_io_tg 766 ms 556 ms (1.38x szybciej)
async_tree_eager_memoization 203 ms 203 ms (nieznacznie)
async_tree_eager_memoization_tg 159 ms 161 ms (nieznacznie)
async_tree_eager_tg 52.9 ms 54.1 ms (1.02x wolniej)
async_tree_io 776 ms 565 ms (1.37x szybciej)
async_tree_io_tg 798 ms 556 ms (1.43x szybciej)
async_tree_memoization 379 ms 308 ms (1.23x szybciej)
async_tree_memoization_tg 397 ms 322 ms (1.23x szybciej)
async_tree_none 330 ms 252 ms (1.31x szybciej)
async_tree_none_tg 310 ms 230 ms (1.35x szybciej)
asyncio_tcp 609 ms 585 ms (nieznacznie)
asyncio_tcp_ssl 2.92 sec 1.93 sec (1.51x szybciej)
bench_mp_pool 93.2 ms 93.8 ms (nieznacznie)
bench_thread_pool 1.02 ms 982 us (1.04x szybciej)
chameleon 5.53 ms 5.41 ms (1.02x szybciej)
chaos 49.3 ms 41.9 ms (1.18x szybciej)
comprehensions 15.6 us 11.4 us (1.37x szybciej)
coroutines 15.5 ms 14.1 ms (1.10x szybciej)
coverage 37.3 ms 144 ms (3.85x wolniej)
create_gc_cycles 783 us 883 us (1.13x wolniej)
crypto_pyaes 53.9 ms 50.0 ms (1.08x szybciej)
deepcopy 251 us 260 us (1.04x wolniej)
deepcopy_memo 27.2 us 25.4 us (1.07x szybciej)
deepcopy_reduce 2.24 us 2.30 us (1.03x wolniej)
deltablue 2.31 ms 2.11 ms (1.09x szybciej)
django_template 25.2 ms 24.9 ms (1.01x szybciej)
docutils 1.84 sec 1.93 sec (1.05x wolniej)
fannkuch 281 ms 278 ms (1.01x szybciej)
float 59.8 ms 54.6 ms (1.10x szybciej)
gc_traversal 1.78 ms 1.87 ms (1.05x wolniej)
generators 22.4 ms 22.4 ms (nieznacznie)
genshi_text 16.3 ms 17.2 ms (1.06x wolniej)
genshi_xml 96.2 ms 96.8 ms (1.08x wolniej)
hexiom 4.48 ms 4.27 ms (1.05x szybciej)
html5lib 42.6 ms 44.2 ms (1.04x wolniej)
json_dumps 6.57 ms 6.64 ms (nieznacznie)
json_loads 16.3 us 16.5 us (nieznacznie)
logging_format 7.15 us 6.60 us (1.08x szybciej)
logging_silent 65.4 ns 59.6 ns (1.10x szybciej)
logging_simple 6.75 us 6.11 us (1.10x szybciej)
mako 7.30 ms 7.02 ms (1.04x szybciej)
mdp 1.65 sec 1.72 sec (1.04x wolniej)
meteor_contest 82.9 ms 81.2 ms (1.02x szybciej)
nbody 80.2 ms 75.7 ms (1.06x szybciej)
nqueens 66.3 ms 63.8 ms (1.04x szybciej)
pathlib 82.9 ms 81.1 ms (1.02x szybciej)
pickle 8.26 us 8.29 us (nieznacznie)
pickle_dict 21.2 us 20.4 us (1.04x szybciej)
pickle_list 3.28 us 3.45 us (1.05x wolniej)
pickle_pure_python 218 us 209 us (1.04x szybciej)
pidigits 171 ms 168 ms (1.02x szybciej)
pprint_pformat 1.16 sec 1.13 sec (1.02x szybciej)
pprint_safe_repr 572 ms 560 ms (1.02x szybciej)
pyflate 341 ms 321 ms (1.06x szybciej)
python_startup 25.4 ms 26.1 ms (1.03x wolniej)
python_startup_no_site 21.9 ms 21.7 ms (nieznacznie)
raytrace 218 ms 176 ms (1.24x szybciej)
regex_compile 97.5 ms 91.4 ms (1.07x szybciej)
regex_dna 131 ms 131 ms (nieznacznie)
regex_effbot 1.79 ms 1.78 ms (nieznacznie)
regex_v8 15.0 ms 18.9 ms (1.26x wolniej)
richards 29.8 ms 29.2 ms (1.02x szybciej)
richards_super 33.8 ms 33.3 ms (1.02x szybciej)
scimark_fft 220 ms 193 ms (1.14x szybciej)
scimark_lu 70.5 ms 60.1 ms (1.17x szybciej)
scimark_monte_carlo 49.7 ms 45.7 ms (1.09x szybciej)
scimark_sor 92.4 ms 81.5 ms (1.13x szybciej)
scimark_sparse_mat_mult 3.14 ms 2.64 ms (1.19x szybciej)
spectral_norm 77.4 ms 66.6 ms (1.16x szybciej)
sqlglot_normalize 203 ms 202 ms (1.01x szybciej)
sqlglot_optimize 37.8 ms 38.4 ms (1.01x wolniej)
sqlglot_parse 922 us 860 us (1.07x szybciej)
sqlglot_transpile 1.16 ms 1.10 ms (1.06x szybciej)
sqlite_synth 1.96 us 1.83 us (1.07x szybciej)
sympy_expand 307 ms 331 ms (1.08x wolniej)
sympy_integrate 14.3 ms 14.0 ms (1.02x szybciej)
sympy_str 189 ms 191 ms (1.01x wolniej)
sympy_sum 100 ms 99.3 ms (1.01x szybciej)
telco 4.70 ms 5.62 ms (1.19x wolniej)
tomli_loads 1.56 sec 1.58 sec (1.01x wolniej)
tornado_http 103 ms 97.7 ms (1.05x szybciej)
typing_runtime_protocols 121 us 116 us (1.05x szybciej)
unpack_sequence 57.4 ns 44.4 ns (1.29x szybciej)
unpickle 9.62 us 9.89 us (1.03x wolniej)
unpickle_list 3.28 us 3.05 us (1.07x szybciej)
unpickle_pure_python 151 us 144 us (1.05x szybciej)
xml_etree_generate 63.7 ms 60.2 ms (1.06x szybciej)
xml_etree_iterparse 71.7 ms 67.4 ms (1.06x szybciej)
xml_etree_parse 106 ms 104 ms (1.02x szybciej)
xml_etree_process 42.9 ms 41.9 ms (1.02x szybciej)
Wynik (średnia geometryczna) 1.05x szybciej

Przeprowadzona analiza wskazuje na to, że Python 3.13 ma najlepsze wyniki wydajnościowe w porównaniu do Pythona 3.12 w następujących testach: asyncio_tcp_ssl (1.51x szybciej), async_tree_io_tg (1.43x szybciej), async_tree_eager_io (1.40x szybciej). Można jednak zauważyć spadek wydajności w niektórych testach, szczególnie w coverage (3.85x wolniej), regex_v8 (1.26x wolniej), telco (1.19x wolniej).

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

Grupa testów Python 3.13 w porównaniu do Pythona 3.12
apps nieznacznie
asyncio 1.19x szybciej
math 1.06x szybciej
regex 1.04x wolniej
serialize 1.02x szybciej
startup 1.01x wolniej
template 1.02x wolniej
Polski
English
Русский