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 |