Python 3.9 kontra Python 3.10 – test wydajności

W tym artykule zostały opisane wyniki testów wydajnościowych dla Pythona 3.10 w porównaniu z Pythonem 3.9. W sumie zostało przeprowadzono 88 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.9.13 oraz Pythonie 3.10.11 (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 88 testów przeprowadzonych przy użyciu Pythona 3.9 (jako punktu odniesienia) i Pythona 3.10 na tym urządzeniu.

Nazwa testu Python 3.9 Python 3.10
2to3 217 ms 216 ms (nieistotne)
async_generators 221 ms 230 ms (1.04x wolniej)
async_tree_cpu_io_mixed 682 ms 685 ms (nieistotne)
async_tree_io 1.33 sec 1.32 sec (nieistotne)
async_tree_memoization 559 ms 560 ms (nieistotne)
async_tree_none 479 ms 471 ms (nieistotne)
asyncio_tcp 619 ms 686 ms (1.11x wolniej)
asyncio_tcp_ssl 1.76 sec 2.04 sec (1.16x wolniej)
bench_mp_pool 56.7 ms 55.4 ms (1.02x szybciej)
bench_thread_pool 706 us 725 us (1.03x wolniej)
chameleon 6.03 ms 5.89 ms (1.02x szybciej)
chaos 57.6 ms 57.1 ms (1.01x szybciej)
comprehensions 14.5 us 14.6 us (nieistotne)
coroutines 21.4 ms 17.3 ms (1.24x szybciej)
coverage 25.5 ms 33.5 ms (1.31x wolniej)
create_gc_cycles 635 us 637 us (1.00x wolniej)
crypto_pyaes 61.8 ms 62.7 ms (1.01x wolniej)
dask 269 ms 263 ms (1.02x szybciej)
deepcopy 245 us 253 us (1.03x wolniej)
deepcopy_memo 28.3 us 28.9 us (1.02x wolniej)
deepcopy_reduce 2.19 us 2.20 us (nieistotne)
deltablue 4.00 ms 4.27 ms (1.07x wolniej)
django_template 28.4 ms 28.2 ms (1.01x szybciej)
docutils 1.57 sec 1.63 sec (1.04x wolniej)
fannkuch 263 ms 256 ms (nieistotne)
float 66.6 ms 66.7 ms (nieistotne)
gc_traversal 1.20 ms 1.20 ms (nieistotne)
generators 32.8 ms 41.8 ms (1.27x wolniej)
genshi_text 19.1 ms 18.7 ms (1.02x szybciej)
genshi_xml 140 ms 132 ms (nieistotne)
hexiom 5.26 ms 5.46 ms (1.04x wolniej)
html5lib 41.6 ms 39.3 ms (1.06x szybciej)
json_dumps 8.28 ms 8.09 ms (1.02x szybciej)
json_loads 14.0 us 13.3 us (1.05x szybciej)
logging_format 6.22 us 6.74 us (1.08x wolniej)
logging_silent 104 ns 102 ns (nieistotne)
logging_simple 5.78 us 6.36 us (1.10x wolniej)
mako 9.41 ms 9.04 ms (1.04x szybciej)
mdp 1.77 sec 1.68 sec (1.05x szybciej)
meteor_contest 63.7 ms 65.9 ms (1.04x wolniej)
nbody 80.7 ms 81.8 ms (1.01x wolniej)
nqueens 57.7 ms 61.3 ms (1.06x wolniej)
pathlib 80.5 ms 81.3 ms (1.01x wolniej)
pickle 6.98 us 6.86 us (1.02x szybciej)
pickle_dict 17.9 us 18.5 us (1.03x wolniej)
pickle_list 2.49 us 2.58 us (1.04x wolniej)
pickle_pure_python 250 us 258 us (1.03x wolniej)
pidigits 139 ms 136 ms (1.02x szybciej)
pprint_pformat 900 ms 1.17 sec (1.30x wolniej)
pyflate 394 ms 387 ms (1.02x szybciej)
python_startup 17.7 ms 17.4 ms (1.01x szybciej)
python_startup_no_site 13.2 ms 13.2 ms (nieistotne)
raytrace 267 ms 275 ms (1.03x wolniej)
regex_compile 86.8 ms 89.5 ms (1.03x wolniej)
regex_dna 106 ms 111 ms (1.04x wolniej)
regex_effbot 1.81 ms 1.78 ms (1.01x szybciej)
regex_v8 14.9 ms 15.0 ms (1.01x wolniej)
richards 38.0 ms 41.7 ms (1.10x wolniej)
richards_super 48.5 ms 50.9 ms (1.05x wolniej)
scimark_fft 205 ms 223 ms (1.09x wolniej)
scimark_lu 85.4 ms 94.3 ms (1.10x wolniej)
scimark_monte_carlo 57.9 ms 58.1 ms (nieistotne)
scimark_sor 105 ms 105 ms (nieistotne)
scimark_sparse_mat_mult 3.04 ms 3.47 ms (1.14x wolniej)
spectral_norm 79.7 ms 82.1 ms (1.03x wolniej)
sqlalchemy_declarative 72.4 ms 78.0 ms (1.08x wolniej)
sqlalchemy_imperative 8.55 ms 8.51 ms (1.01x szybciej)
sqlglot_normalize 181 ms 198 ms (1.10x wolniej)
sqlglot_optimize 34.6 ms 37.1 ms (1.07x wolniej)
sqlglot_parse 1.20 ms 1.12 ms (1.07x szybciej)
sqlglot_transpile 1.36 ms 1.33 ms (1.03x szybciej)
sqlite_synth 1.68 us 1.54 us (1.09x szybciej)
sympy_expand 261 ms 265 ms (1.02x wolniej)
sympy_integrate 12.8 ms 12.7 ms (1.01x szybciej)
sympy_str 159 ms 162 ms (1.02x wolniej)
sympy_sum 87.4 ms 91.4 ms (1.05x wolniej)
telco 3.89 ms 3.80 ms (1.02x szybciej)
tomli_loads 1.57 sec 1.69 sec (1.07x wolniej)
tornado_http 101 ms 98.2 ms (1.03x szybciej)
typing_runtime_protocols 301 us 314 us (1.04x wolniej)
unpack_sequence 35.0 ns 39.3 ns (1.12x wolniej)
unpickle 7.90 us 8.59 us (1.09x wolniej)
unpickle_list 2.87 us 2.87 us (nieistotne)
unpickle_pure_python 171 us 176 us (1.03x wolniej)
xml_etree_generate 53.7 ms 55.2 ms (1.03x wolniej)
xml_etree_iterparse 55.4 ms 57.6 ms (1.04x wolniej)
xml_etree_parse 84.1 ms 83.4 ms (1.01x szybciej)
xml_etree_process 42.9 ms 44.4 ms (1.04x wolniej)
Wynik (średnia geometryczna) 1.02x wolniej

Przeprowadzona analiza wskazuje na to, że Python 3.10 ma najlepsze wyniki wydajnościowe w porównaniu do Pythona 3.9 w następujących testach: coroutines (1.24x szybciej), sqlite_synth (1.09x szybciej), sqlglot_parse (1.07x szybciej). Można jednak zauważyć spadek wydajności w niektórych testach, szczególnie w coverage (1.31x wolniej), pprint_pformat (1.30x wolniej), generators (1.27x wolniej).

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

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

Nazwa testu Python 3.9 Python 3.10
2to3 281 ms 282 ms (nieistotne)
async_generators 249 ms 254 ms (1.02x wolniej)
async_tree_cpu_io_mixed 708 ms 716 ms (1.01x wolniej)
async_tree_io 1.17 sec 1.16 sec (1.01x szybciej)
async_tree_memoization 583 ms 593 ms (1.02x wolniej)
async_tree_none 479 ms 486 ms (nieistotne)
asyncio_tcp 912 ms 981 ms (1.08x wolniej)
asyncio_tcp_ssl 2.24 sec 2.43 sec (1.08x wolniej)
bench_mp_pool 92.4 ms 89.5 ms (1.03x szybciej)
bench_thread_pool 1.20 ms 1.24 ms (nieistotne)
chameleon 6.93 ms 6.47 ms (1.07x szybciej)
chaos 69.2 ms 68.8 ms (nieistotne)
comprehensions 16.3 us 18.4 us (1.13x wolniej)
coroutines 25.4 ms 18.0 ms (1.42x szybciej)
coverage 25.2 ms 33.0 ms (1.31x wolniej)
create_gc_cycles 883 us 888 us (nieistotne)
crypto_pyaes 70.5 ms 70.3 ms (nieistotne)
dask 436 ms 431 ms (1.01x szybciej)
deepcopy 288 us 293 us (1.02x wolniej)
deepcopy_memo 31.2 us 32.0 us (1.03x wolniej)
deepcopy_reduce 2.52 us 2.47 us (1.02x szybciej)
deltablue 4.50 ms 4.71 ms (1.05x wolniej)
django_template 34.6 ms 33.3 ms (1.04x szybciej)
docutils 2.08 sec 2.19 sec (1.05x wolniej)
fannkuch 289 ms 306 ms (1.06x wolniej)
float 73.1 ms 70.0 ms (1.04x szybciej)
gc_traversal 1.69 ms 1.69 ms (nieistotne)
generators 34.4 ms 36.0 ms (1.05x wolniej)
genshi_text 21.1 ms 21.6 ms (1.02x wolniej)
genshi_xml 157 ms 153 ms (1.03x wolniej)
hexiom 5.86 ms 6.22 ms (1.06x wolniej)
html5lib 56.1 ms 56.0 ms (nieistotne)
json_dumps 8.96 ms 9.76 ms (1.09x wolniej)
json_loads 16.5 us 16.0 us (1.03x szybciej)
logging_format 7.50 us 8.15 us (1.09x wolniej)
logging_silent 110 ns 106 ns (1.04x szybciej)
logging_simple 6.97 us 7.60 us (1.09x wolniej)
mako 10.5 ms 9.78 ms (1.07x szybciej)
mdp 1.99 sec 1.96 sec (1.02x szybciej)
meteor_contest 81.9 ms 83.7 ms (1.02x wolniej)
nbody 81.5 ms 80.5 ms (nieistotne)
nqueens 69.8 ms 75.9 ms (1.09x wolniej)
pathlib 74.6 ms 77.5 ms (1.04x wolniej)
pickle 7.89 us 7.85 us (nieistotne)
pickle_dict 20.0 us 20.9 us (1.04x wolniej)
pickle_list 3.01 us 3.11 us (1.03x wolniej)
pickle_pure_python 292 us 302 us (1.04x wolniej)
pidigits 170 ms 167 ms (1.02x szybciej)
pprint_pformat 1.05 sec 1.39 sec (1.33x wolniej)
pyflate 471 ms 461 ms (1.02x szybciej)
python_startup 25.1 ms 25.0 ms (nieistotne)
python_startup_no_site 19.8 ms 19.4 ms (1.02x szybciej)
raytrace 301 ms 320 ms (1.06x wolniej)
regex_compile 112 ms 118 ms (1.05x wolniej)
regex_dna 147 ms 148 ms (nieistotne)
regex_effbot 1.78 ms 1.88 ms (1.06x wolniej)
regex_v8 16.5 ms 17.0 ms (1.03x wolniej)
richards 41.1 ms 46.6 ms (1.13x wolniej)
richards_super 51.7 ms 58.5 ms (1.13x wolniej)
scimark_fft 211 ms 214 ms (1.01x wolniej)
scimark_lu 87.0 ms 93.7 ms (1.08x wolniej)
scimark_monte_carlo 65.7 ms 64.1 ms (1.03x szybciej)
scimark_sor 111 ms 114 ms (1.03x wolniej)
scimark_sparse_mat_mult 2.95 ms 2.97 ms (nieistotne)
spectral_norm 86.0 ms 84.8 ms (1.02x szybciej)
sqlalchemy_declarative 115 ms 125 ms (1.09x wolniej)
sqlalchemy_imperative 13.3 ms 13.1 ms (1.02x szybciej)
sqlglot_normalize 207 ms 234 ms (1.13x wolniej)
sqlglot_optimize 41.0 ms 44.8 ms (1.09x wolniej)
sqlglot_parse 1.38 ms 1.40 ms (1.01x wolniej)
sqlglot_transpile 1.62 ms 1.67 ms (1.03x wolniej)
sqlite_synth 2.26 us 2.16 us (1.05x szybciej)
sympy_expand 352 ms 367 ms (1.04x wolniej)
sympy_integrate 16.7 ms 17.4 ms (1.04x wolniej)
sympy_str 212 ms 223 ms (1.05x wolniej)
sympy_sum 115 ms 124 ms (1.08x wolniej)
telco 4.38 ms 4.42 ms (1.01x wolniej)
tomli_loads 1.75 sec 1.89 sec (1.08x wolniej)
tornado_http 142 ms 140 ms (1.02x szybciej)
typing_runtime_protocols 361 us 378 us (1.05x wolniej)
unpack_sequence 40.9 ns 44.9 ns (1.10x wolniej)
unpickle 9.05 us 9.21 us (nieistotne)
unpickle_list 2.99 us 3.16 us (1.06x wolniej)
unpickle_pure_python 199 us 209 us (1.05x wolniej)
xml_etree_generate 59.5 ms 61.8 ms (1.04x wolniej)
xml_etree_iterparse 69.7 ms 74.4 ms (1.07x wolniej)
xml_etree_parse 113 ms 114 ms (nieistotne)
xml_etree_process 54.6 ms 49.5 ms (1.10x szybciej)
Wynik (średnia geometryczna) 1.03x wolniej

Przeprowadzona analiza wskazuje na to, że Python 3.10 ma najlepsze wyniki wydajnościowe w porównaniu do Pythona 3.9 w następujących testach: coroutines (1.42x szybciej), xml_etree_process (1.10x szybciej), chameleon (1.07x szybciej). Można jednak zauważyć spadek wydajności w niektórych testach, szczególnie w pprint_pformat (1.33x wolniej), coverage (1.31x wolniej), comprehensions (1.13x wolniej).

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

Grupa testów Python 3.10 w porównaniu do Pythona 3.9
apps 1.01x szybciej
asyncio 1.01x wolniej
math 1.03x szybciej
regex 1.04x wolniej
serialize 1.03x wolniej
startup 1.01x szybciej
template 1.01x szybciej
Polski
English
Русский