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 |