Porównano wydajność Python 3.14.8 i Python 3.15.0 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. W obu przypadkach użyto 64-bitowych kompilacji Pythona działających w systemie Windows 11. Testy przeprowadzono za pomocą pakietu pyperformance 1.14.0 i narzędzia pomiarowego pyperf 2.10.0.

Interpretacja wyników

Każda wartość czasu w tabelach jest średnią arytmetyczną ze średnich czasów danego testu w powtarzanych sesjach pomiarowych. Każda sesja ma taką samą wagę. Wyniki kalibracji i pomiarów „rozgrzewkowych” są pomijane. Współczynniki przyspieszenia oblicza się na podstawie uśrednionych czasów, a nie przez uśrednienie wcześniej wyznaczonych współczynników. W ten sposób każdy test otrzymuje jeden zbiorczy wynik.

Krótszy czas oznacza lepszy wynik. Punktem odniesienia jest Python 3.14. Wynik 1,50× szybciej oznacza, że Python 3.15 potrzebuje około dwóch trzecich czasu wersji referencyjnej, czyli o 33,33% mniej. Wynik 1,20× wolniej oznacza czas dłuższy o 20%. Kolumna „Zmiana czasu” przedstawia procentową zmianę względem Pythona 3.14. Wartości ujemne oznaczają krótszy czas wykonania.

Wynik ogólny jest średnią geometryczną współczynników przyspieszenia poszczególnych testów. Każdy test dostępny dla obu wersji ma taką samą wagę, niezależnie od czasu jego wykonania. Jest to podsumowanie zestawu testów, a nie prognoza przyspieszenia całej aplikacji. Czasy zaokrąglono dla czytelności; wszystkie obliczenia wykorzystują wartości przed zaokrągleniem.

Kolor niebieski oznacza krótszy czas wykonania, a czerwony – dłuższy. Przyspieszenia i spowolnienia o współczynniku co najmniej 1,10× wyróżniono pogrubieniem. Symbol † oznacza wyniki, które wykazywały dużą zmienność lub zmieniały kierunek różnicy między sesjami. Wielkość takich zmian oraz niewielkie różnice względem wyniku referencyjnego wymagają ostrożnej interpretacji. Tabele przedstawiają uśrednione obserwacje i nie potwierdzają istotności statystycznej każdej różnicy.

Ogólna wydajność Pythona 3.15 względem Pythona 3.14
Komputer Testy dostępne dla obu wersji Średnia geometryczna przyspieszenia Odpowiadająca zmiana czasu
AMD Ryzen 9 7900 122 1,451× szybciej -31,10%
Intel Core i3-1315U 118 1,451× szybciej -31,10%

Jednakowy zapis 1,451× w obu wierszach wynika z zaokrąglenia. Obliczone wartości to około 1,451413092× dla AMD i 1,451321030× dla Intela. Zestawy obejmują odpowiednio 122 i 118 testów, więc nie są identyczne. Taki wynik nie oznacza jednakowej korzyści dla wszystkich aplikacji ani przewagi któregoś producenta procesorów.

Python 3.15 jest szybszy w większości badanych zadań. Średnia geometryczna współczynników przyspieszenia wynosi około 1,45× na obu komputerach. Największe korzyści występują w testach kodowania Ascii85, Base32 i Base85. Po wyłączeniu tych sześciu wyjątkowo dużych przyspieszeń pozostała część zestawu uzyskuje wynik około 1,20×. Niektóre testy Base16 i wyrażeń regularnych wykazują spadek wydajności, dlatego korzyść zależy od rodzaju wykonywanych operacji.

Komputer stacjonarny z procesorem AMD Ryzen 9 7900

Komputer stacjonarny AMD jest wyposażony w procesor Ryzen 9 7900, pamięć RAM DDR5 oraz dysk M.2 PCIe Gen4 NVMe.

Na tym komputerze dostępne są wyniki 122 testów dla obu wersji. Średnia geometryczna współczynników przyspieszenia Pythona 3.15 wynosi 1,451×. W znormalizowanym podsumowaniu zestawu odpowiada to skróceniu czasu o około 31,1%. Mediana współczynników przyspieszenia wynosi 1,184×, co pokazuje, że niewielka liczba wyjątkowo dużych przyspieszeń podnosi wynik ogólny.

Największe przyspieszenia występują w testach base32_large (134,748× szybciej), ascii85_large (68,675× szybciej), base85_large (63,446× szybciej). Warianty tych testów kodowania dla małych danych również uzyskują duże przyspieszenia.

Największe wyraźne spowolnienia w uśrednionych wynikach występują w testach base16_large (1,223× wolniej), base16_small (1,222× wolniej), regex_effbot (1,222× wolniej). Spadki te są szczególnie istotne dla aplikacji, które często wykonują te operacje.

Wyniki AMD były zasadniczo spójne w powtarzanych pomiarach. Czas uruchamiania bez modułu site pozostaje bliski wynikowi wersji referencyjnej, a test logging_silent obejmuje pomiar o dużej zmienności. Z tego względu większe znaczenie przy interpretacji mają duże, powtarzalne przyspieszenia niż niewielkie różnice lub dokładna wielkość zmian w tych dwóch testach.

AMD Ryzen 9 7900 — komputer stacjonarny: uśrednione czasy wykonania
Test Python 3.14.8 Python 3.15.0 Zmiana czasu
2to3 229,3 ms 207,6 ms (1,105× szybciej) -9,47%
ascii85_large 797,9 ms 11,62 ms (68,675× szybciej) -98,54%
ascii85_small 14,88 ms 0,3875 ms (38,394× szybciej) -97,40%
async_generators 269,8 ms 237,9 ms (1,134× szybciej) -11,82%
async_tree_cpu_io_mixed 420,2 ms 393,4 ms (1,068× szybciej) -6,38%
async_tree_cpu_io_mixed_tg 404,4 ms 380,8 ms (1,062× szybciej) -5,83%
async_tree_eager 124,2 ms 98,19 ms (1,265× szybciej) -20,94%
async_tree_eager_cpu_io_mixed 349 ms 322,5 ms (1,082× szybciej) -7,60%
async_tree_eager_cpu_io_mixed_tg 365,3 ms 342,9 ms (1,065× szybciej) -6,12%
async_tree_eager_io 652,8 ms 588,9 ms (1,108× szybciej) -9,78%
async_tree_eager_io_tg 610,1 ms 558,3 ms (1,093× szybciej) -8,49%
async_tree_eager_memoization 190,5 ms 170,7 ms (1,116× szybciej) -10,40%
async_tree_eager_memoization_tg 243,9 ms 224 ms (1,089× szybciej) -8,17%
async_tree_eager_tg 184,9 ms 166,3 ms (1,112× szybciej) -10,07%
async_tree_io 617,5 ms 558,8 ms (1,105× szybciej) -9,50%
async_tree_io_tg 581,5 ms 511,6 ms (1,137× szybciej) -12,02%
async_tree_memoization 308,5 ms 278 ms (1,109× szybciej) -9,86%
async_tree_memoization_tg 267,1 ms 240,1 ms (1,112× szybciej) -10,11%
async_tree_none 248,5 ms 225,8 ms (1,101× szybciej) -9,15%
async_tree_none_tg 215,4 ms 194,4 ms (1,108× szybciej) -9,73%
asyncio_tcp 458,4 ms 435,2 ms (1,053× szybciej) -5,05%
asyncio_tcp_ssl 1,258 s 1,219 s (1,031× szybciej) -3,05%
asyncio_websockets 141,6 ms 125,6 ms (1,128× szybciej) -11,33%
base16_large 4,714 ms 5,767 ms (1,223× wolniej) +22,34%
base16_small 252,3 µs 308,3 µs (1,222× wolniej) +22,20%
base32_large 327,6 ms 2,431 ms (134,748× szybciej) -99,26%
base32_small 6,227 ms 0,163 ms (38,200× szybciej) -97,38%
base64_large 6,746 ms 1,852 ms (3,643× szybciej) -72,55%
base64_small 219,5 µs 169,2 µs (1,297× szybciej) -22,91%
base85_large 272,4 ms 4,293 ms (63,446× szybciej) -98,42%
base85_small 4,864 ms 0,1505 ms (32,313× szybciej) -96,91%
bench_mp_pool 126 ms 112 ms (1,125× szybciej) -11,08%
bench_thread_pool 738,9 µs 658,8 µs (1,122× szybciej) -10,84%
bpe_tokeniser 2,968 s 2,318 s (1,280× szybciej) -21,90%
chameleon 9,954 ms 8,428 ms (1,181× szybciej) -15,33%
chaos 44,06 ms 31,3 ms (1,408× szybciej) -28,98%
comprehensions 12,2 µs 8,117 µs (1,503× szybciej) -33,47%
connected_components 388,3 ms 365,8 ms (1,061× szybciej) -5,78%
coroutines 17,05 ms 12,87 ms (1,325× szybciej) -24,50%
coverage 52,53 ms 48,64 ms (1,080× szybciej) -7,39%
create_gc_cycles 1,03 ms 0,8892 ms (1,158× szybciej) -13,66%
crypto_pyaes 50,48 ms 39,17 ms (1,289× szybciej) -22,41%
dask 720,2 ms 687,5 ms (1,048× szybciej) -4,54%
deepcopy 174,8 µs 129,9 µs (1,346× szybciej) -25,69%
deepcopy_memo 19,74 µs 14,64 µs (1,349× szybciej) -25,86%
deepcopy_reduce 1,899 µs 1,541 µs (1,232× szybciej) -18,83%
deltablue 2,508 ms 1,669 ms (1,503× szybciej) -33,46%
django_template 24,56 ms 20,47 ms (1,200× szybciej) -16,67%
docutils 1,425 s 1,272 s (1,120× szybciej) -10,74%
dulwich_log 48,84 ms 44,74 ms (1,092× szybciej) -8,40%
fannkuch 280,5 ms 208,5 ms (1,345× szybciej) -25,65%
fastapi_http 454,7 ms 399,9 ms (1,137× szybciej) -12,06%
float 57,28 ms 44,02 ms (1,301× szybciej) -23,16%
gc_traversal 1,807 ms 1,682 ms (1,074× szybciej) -6,89%
generators 23,32 ms 16,29 ms (1,431× szybciej) -30,14%
go 89,44 ms 59,34 ms (1,507× szybciej) -33,65%
hexiom 4,914 ms 3,178 ms (1,546× szybciej) -35,32%
html5lib 33,73 ms 28,44 ms (1,186× szybciej) -15,68%
json_dumps 6,731 ms 4,862 ms (1,384× szybciej) -27,77%
json_loads 14,53 µs 13,06 µs (1,113× szybciej) -10,15%
k_core 1,708 s 1,616 s (1,057× szybciej) -5,39%
logging_format 6,286 µs 5,081 µs (1,237× szybciej) -19,18%
logging_silent † 75,05 ns 51,26 ns (1,464× szybciej †) -31,69%
logging_simple 5,845 µs 4,72 µs (1,238× szybciej) -19,25%
mako 7,97 ms 6,643 ms (1,200× szybciej) -16,65%
many_optionals 386,7 µs 297,7 µs (1,299× szybciej) -23,02%
mdp 829,3 ms 661,3 ms (1,254× szybciej) -20,25%
meteor_contest 69,78 ms 60,92 ms (1,145× szybciej) -12,70%
nbody 89,91 ms 62,13 ms (1,447× szybciej) -30,89%
nqueens 65,02 ms 43,38 ms (1,499× szybciej) -33,28%
pathlib 232,9 ms 228,7 ms (1,018× szybciej) -1,80%
pickle 7,953 µs 7,807 µs (1,019× szybciej) -1,83%
pickle_dict 20,5 µs 17,69 µs (1,159× szybciej) -13,73%
pickle_list 3,041 µs 2,82 µs (1,078× szybciej) -7,26%
pickle_pure_python 217,3 µs 175,2 µs (1,240× szybciej) -19,38%
pidigits 129,7 ms 128,8 ms (1,007× szybciej) -0,69%
pprint_pformat 1,034 s 0,8316 s (1,243× szybciej) -19,55%
pprint_safe_repr 502,5 ms 413,3 ms (1,216× szybciej) -17,76%
pyflate 323 ms 239,9 ms (1,346× szybciej) -25,73%
python_startup 35,18 ms 34,36 ms (1,024× szybciej) -2,34%
python_startup_no_site † 29,09 ms 29,23 ms (1,005× wolniej †) +0,47%
raytrace 192,8 ms 144 ms (1,339× szybciej) -25,34%
regex_compile 75,55 ms 54,3 ms (1,391× szybciej) -28,12%
regex_dna 107,9 ms 118,7 ms (1,100× wolniej) +10,00%
regex_effbot 1,588 ms 1,94 ms (1,222× wolniej) +22,17%
regex_v8 14,92 ms 15,13 ms (1,014× wolniej) +1,38%
richards 31,37 ms 22,75 ms (1,379× szybciej) -27,47%
richards_super 35,52 ms 26,14 ms (1,359× szybciej) -26,42%
scimark_fft 217,5 ms 163,4 ms (1,331× szybciej) -24,89%
scimark_lu 77,23 ms 54,56 ms (1,416× szybciej) -29,35%
scimark_monte_carlo 48,66 ms 36,72 ms (1,325× szybciej) -24,54%
scimark_sor 93,32 ms 62,58 ms (1,491× szybciej) -32,94%
scimark_sparse_mat_mult 3,372 ms 2,504 ms (1,347× szybciej) -25,76%
shortest_path 397,5 ms 372,7 ms (1,067× szybciej) -6,24%
spectral_norm 77,96 ms 52,58 ms (1,483× szybciej) -32,55%
sphinx 617,7 ms 552,5 ms (1,118× szybciej) -10,56%
sqlalchemy_declarative 61,12 ms 54,38 ms (1,124× szybciej) -11,02%
sqlalchemy_imperative 6,798 ms 5,959 ms (1,141× szybciej) -12,35%
sqlglot_v2_normalize 71,32 ms 58,48 ms (1,220× szybciej) -18,01%
sqlglot_v2_optimize 33,61 ms 27,93 ms (1,203× szybciej) -16,88%
sqlglot_v2_parse 869,3 µs 621,4 µs (1,399× szybciej) -28,52%
sqlglot_v2_transpile 1,05 ms 0,7834 ms (1,340× szybciej) -25,39%
sqlite_synth 1,523 µs 1,37 µs (1,112× szybciej) -10,04%
subparsers 6,756 ms 5,747 ms (1,176× szybciej) -14,94%
sympy_expand 258,3 ms 220 ms (1,174× szybciej) -14,84%
sympy_integrate 11,35 ms 9,662 ms (1,175× szybciej) -14,90%
sympy_str 149,4 ms 124,8 ms (1,198× szybciej) -16,50%
sympy_sum 78,46 ms 66,41 ms (1,181× szybciej) -15,35%
telco 4,94 ms 4,111 ms (1,202× szybciej) -16,78%
tomli_loads 1,585 s 1,023 s (1,549× szybciej) -35,45%
tornado_http 99,88 ms 93,48 ms (1,068× szybciej) -6,41%
typing_runtime_protocols 107 µs 88,07 µs (1,215× szybciej) -17,69%
unpack_sequence 48,21 ns 31,01 ns (1,555× szybciej) -35,68%
unpickle 8,886 µs 8,827 µs (1,007× szybciej) -0,67%
unpickle_list 2,806 µs 2,865 µs (1,021× wolniej) +2,11%
unpickle_pure_python 157,6 µs 116,6 µs (1,352× szybciej) -26,01%
urlsafe_base64_small 340,4 µs 206,1 µs (1,651× szybciej) -39,45%
xdsl_constant_fold 24,33 ms 20,97 ms (1,160× szybciej) -13,81%
xml_etree_generate 59,89 ms 50,36 ms (1,189× szybciej) -15,92%
xml_etree_iterparse 54,9 ms 47,99 ms (1,144× szybciej) -12,59%
xml_etree_parse 80,08 ms 77,91 ms (1,028× szybciej) -2,71%
xml_etree_process 42,23 ms 34,81 ms (1,213× szybciej) -17,58%
Wynik (średnia geometryczna) – 1,451× szybciej -31,10%

Jednostki: s — sekundy; ms — milisekundy; µs — mikrosekundy; ns — nanosekundy. W każdym wierszu oba czasy mają tę samą jednostkę. Symbol † oznacza pomiary wymagające dodatkowej ostrożności.

Wydajność według grup testów

Poniższa tabela podsumowuje testy oznaczone danym znacznikiem w pakiecie pyperformance. Grupy mogą się nakładać i nie obejmują wszystkich testów. Grupa math zawiera tylko trzy testy; nie jest podsumowaniem wszystkich obliczeń numerycznych w zestawie.

AMD Ryzen 9 7900 — komputer stacjonarny: średnia geometryczna według znaczników
Grupa (znacznik) Testy dostępne dla obu wersji Python 3.15 względem Pythona 3.14 Odpowiadająca zmiana czasu
apps 7 1,130× szybciej -11,52%
asyncio 21 1,113× szybciej -10,13%
math 3 1,238× szybciej -19,21%
regex 4 1,005× szybciej -0,52%
serialize 25 3,046× szybciej -67,17%
startup 2 1,010× szybciej -0,95%
template 2 1,200× szybciej -16,66%

Testy z wynikiem tylko dla Pythona 3.14, wyłączone z porównania: genshi_text, genshi_xml. Dostarczone dane nie wyjaśniają braku tych wyników dla Pythona 3.15.

Mini PC z procesorem Intel Core i3-1315U

Mini PC Intel jest wyposażony w procesor Core i3-1315U, pamięć RAM DDR4 oraz dysk M.2 PCIe Gen4 NVMe. Model i3-1315U jest procesorem mobilnym stosowanym także w laptopach.

Na tym komputerze dostępne są wyniki 118 testów dla obu wersji. Średnia geometryczna współczynników przyspieszenia Pythona 3.15 wynosi 1,451×. W znormalizowanym podsumowaniu zestawu odpowiada to skróceniu czasu o około 31,1%. Mediana współczynników przyspieszenia wynosi 1,166×, co pokazuje, że niewielka liczba wyjątkowo dużych przyspieszeń podnosi wynik ogólny.

Największe przyspieszenia występują w testach base32_large (142,255× szybciej), base85_large (62,619× szybciej), ascii85_large (56,825× szybciej). Warianty tych testów kodowania dla małych danych również uzyskują duże przyspieszenia.

Największe wyraźne spowolnienia w uśrednionych wynikach występują w testach base16_small (1,241× wolniej), base16_large (1,158× wolniej), regex_effbot (1,133× wolniej). Spadki te są szczególnie istotne dla aplikacji, które często wykonują te operacje.

Pomiary Intela wykazywały większą zmienność. W szczególności wielkość przyspieszenia w testach pathlib, sphinx, scimark_sor, scimark_sparse_mat_mult i spectral_norm zależała od sesji pomiarowej. Niektóre pomiary pathlib i puli wątków zawierają wyjątkowo długie czasy wykonania. Uśrednienie daje zbiorczy obraz wyników, ale poszczególne wartości nie stanowią precyzyjnej prognozy dla innego komputera.

Intel Core i3-1315U — mini PC: uśrednione czasy wykonania
Test Python 3.14.8 Python 3.15.0 Zmiana czasu
2to3 277,1 ms 247,6 ms (1,119× szybciej) -10,65%
ascii85_large 828,8 ms 14,58 ms (56,825× szybciej) -98,24%
ascii85_small 15,57 ms 0,4626 ms (33,666× szybciej) -97,03%
async_generators 280,8 ms 230,4 ms (1,219× szybciej) -17,96%
async_tree_cpu_io_mixed 435,1 ms 397,7 ms (1,094× szybciej) -8,59%
async_tree_cpu_io_mixed_tg 423,2 ms 411,9 ms (1,027× szybciej) -2,66%
async_tree_eager 118,4 ms 104,9 ms (1,129× szybciej) -11,42%
async_tree_eager_cpu_io_mixed 382,7 ms 360,1 ms (1,063× szybciej) -5,90%
async_tree_eager_cpu_io_mixed_tg 383,3 ms 362 ms (1,059× szybciej) -5,56%
async_tree_eager_io 572,6 ms 513,3 ms (1,116× szybciej) -10,36%
async_tree_eager_io_tg 561,1 ms 509 ms (1,102× szybciej) -9,28%
async_tree_eager_memoization 216 ms 196,2 ms (1,101× szybciej) -9,16%
async_tree_eager_memoization_tg 247,5 ms 227,3 ms (1,089× szybciej) -8,19%
async_tree_eager_tg 191,6 ms 170,4 ms (1,124× szybciej) -11,07%
async_tree_io 593,4 ms 517,4 ms (1,147× szybciej) -12,81%
async_tree_io_tg 567,9 ms 495,3 ms (1,147× szybciej) -12,78%
async_tree_memoization 306,3 ms 274,5 ms (1,116× szybciej) -10,38%
async_tree_memoization_tg 285,9 ms 252,9 ms (1,130× szybciej) -11,54%
async_tree_none 253,3 ms 220,6 ms (1,148× szybciej) -12,92%
async_tree_none_tg 228,9 ms 203,7 ms (1,123× szybciej) -10,98%
asyncio_tcp 582,6 ms 539 ms (1,081× szybciej) -7,48%
asyncio_tcp_ssl 1,537 s 1,527 s (1,007× szybciej) -0,66%
asyncio_websockets 181,7 ms 157,8 ms (1,151× szybciej) -13,15%
base16_large 6,161 ms 7,132 ms (1,158× wolniej) +15,75%
base16_small 298,5 µs 370,3 µs (1,241× wolniej) +24,07%
base32_large 360,9 ms 2,537 ms (142,255× szybciej) -99,30%
base32_small 7,102 ms 0,1753 ms (40,509× szybciej) -97,53%
base64_large 8,03 ms 1,869 ms (4,297× szybciej) -76,73%
base64_small 266,4 µs 191,1 µs (1,394× szybciej) -28,27%
base85_large 298,1 ms 4,761 ms (62,619× szybciej) -98,40%
base85_small 5,369 ms 0,1747 ms (30,739× szybciej) -96,75%
bench_mp_pool 161,1 ms 142,6 ms (1,130× szybciej) -11,47%
bench_thread_pool † 1,083 ms 1,101 ms (1,017× wolniej †) +1,71%
bpe_tokeniser 3,575 s 2,782 s (1,285× szybciej) -22,19%
chameleon 11,36 ms 9,522 ms (1,193× szybciej) -16,18%
chaos 47,02 ms 35,8 ms (1,314× szybciej) -23,88%
comprehensions 13,38 µs 9,357 µs (1,430× szybciej) -30,09%
connected_components 366,4 ms 354,6 ms (1,033× szybciej) -3,22%
coroutines 16,6 ms 13,19 ms (1,258× szybciej) -20,53%
coverage 160,9 ms 123,6 ms (1,302× szybciej) -23,19%
create_gc_cycles 1,711 ms 1,428 ms (1,198× szybciej) -16,53%
crypto_pyaes 57,39 ms 45,55 ms (1,260× szybciej) -20,62%
deepcopy 206,9 µs 153,5 µs (1,348× szybciej) -25,81%
deepcopy_memo 20,81 µs 15,72 µs (1,323× szybciej) -24,44%
deepcopy_reduce 2,224 µs 1,71 µs (1,301× szybciej) -23,14%
deltablue 2,451 ms 1,839 ms (1,333× szybciej) -24,99%
django_template 28,24 ms 22,76 ms (1,241× szybciej) -19,42%
docutils 1,794 s 1,661 s (1,080× szybciej) -7,42%
fannkuch 309 ms 222,6 ms (1,388× szybciej) -27,96%
fastapi_http 351,1 ms 320,7 ms (1,095× szybciej) -8,64%
float 56,19 ms 45,04 ms (1,248× szybciej) -19,85%
gc_traversal 2,853 ms 2,545 ms (1,121× szybciej) -10,81%
generators 25,72 ms 16,94 ms (1,518× szybciej) -34,11%
go 92,33 ms 67,09 ms (1,376× szybciej) -27,34%
hexiom 4,839 ms 3,443 ms (1,405× szybciej) -28,84%
html5lib 44,02 ms 38,9 ms (1,131× szybciej) -11,62%
json_dumps 7,362 ms 5,696 ms (1,292× szybciej) -22,63%
json_loads 17,18 µs 16,01 µs (1,073× szybciej) -6,82%
k_core 1,977 s 1,91 s (1,035× szybciej) -3,39%
logging_format 7,111 µs 5,871 µs (1,211× szybciej) -17,44%
logging_silent 65,46 ns 50,39 ns (1,299× szybciej) -23,02%
logging_simple 6,635 µs 5,423 µs (1,223× szybciej) -18,26%
mako 7,544 ms 6,543 ms (1,153× szybciej) -13,28%
many_optionals 585,5 µs 513,5 µs (1,140× szybciej) -12,30%
mdp 970,9 ms 767 ms (1,266× szybciej) -21,00%
meteor_contest 86,82 ms 75,98 ms (1,143× szybciej) -12,49%
nbody 82,94 ms 59,03 ms (1,405× szybciej) -28,83%
nqueens 73,7 ms 52,9 ms (1,393× szybciej) -28,22%
pathlib † 88,82 ms 77,87 ms (1,141× szybciej †) -12,33%
pickle 9,156 µs 8,568 µs (1,069× szybciej) -6,41%
pickle_dict 24,76 µs 20,2 µs (1,226× szybciej) -18,43%
pickle_list 4,1 µs 3,752 µs (1,093× szybciej) -8,48%
pickle_pure_python 246,7 µs 206 µs (1,198× szybciej) -16,50%
pidigits † 163,1 ms 163,7 ms (1,003× wolniej †) +0,34%
pprint_pformat 1,186 s 0,9441 s (1,257× szybciej) -20,42%
pprint_safe_repr 585,2 ms 476,1 ms (1,229× szybciej) -18,64%
pyflate 343,9 ms 267 ms (1,288× szybciej) -22,36%
python_startup 31,09 ms 30,31 ms (1,026× szybciej) -2,53%
python_startup_no_site † 23,24 ms 23,16 ms (1,003× szybciej †) -0,32%
raytrace 223,5 ms 164,2 ms (1,361× szybciej) -26,54%
regex_compile 94,27 ms 76,29 ms (1,236× szybciej) -19,07%
regex_dna 136,6 ms 135,9 ms (1,005× szybciej) -0,49%
regex_effbot 1,71 ms 1,937 ms (1,133× wolniej) +13,30%
regex_v8 † 16,61 ms 15,72 ms (1,057× szybciej †) -5,36%
richards 32,36 ms 24,82 ms (1,304× szybciej) -23,29%
richards_super 36,74 ms 28,57 ms (1,286× szybciej) -22,22%
scimark_fft 212,5 ms 158,1 ms (1,344× szybciej) -25,58%
scimark_lu 69,29 ms 52,02 ms (1,332× szybciej) -24,92%
scimark_monte_carlo 50,14 ms 36,87 ms (1,360× szybciej) -26,47%
scimark_sor † 103,8 ms 57,98 ms (1,790× szybciej †) -44,12%
scimark_sparse_mat_mult † 3,352 ms 2,368 ms (1,415× szybciej †) -29,35%
shortest_path 403,9 ms 382 ms (1,057× szybciej) -5,40%
spectral_norm † 77,37 ms 50,15 ms (1,543× szybciej †) -35,18%
sphinx † 812,6 ms 725,8 ms (1,120× szybciej †) -10,69%
sqlglot_v2_normalize 85,23 ms 68,7 ms (1,241× szybciej) -19,39%
sqlglot_v2_optimize 40,98 ms 34,54 ms (1,186× szybciej) -15,71%
sqlglot_v2_parse 949,5 µs 737,1 µs (1,288× szybciej) -22,37%
sqlglot_v2_transpile 1,18 ms 0,9215 ms (1,281× szybciej) -21,92%
sqlite_synth 1,832 µs 1,704 µs (1,075× szybciej) -6,96%
subparsers 7,632 ms 6,672 ms (1,144× szybciej) -12,57%
sympy_expand 337,3 ms 290,4 ms (1,162× szybciej) -13,93%
sympy_integrate 14,24 ms 12,71 ms (1,120× szybciej) -10,72%
sympy_str 196,8 ms 171,8 ms (1,145× szybciej) -12,67%
sympy_sum 100,9 ms 88,9 ms (1,135× szybciej) -11,88%
telco 5,451 ms 4,658 ms (1,170× szybciej) -14,55%
tomli_loads 1,679 s 1,096 s (1,532× szybciej) -34,74%
tornado_http 105,5 ms 102,7 ms (1,027× szybciej) -2,61%
typing_runtime_protocols 127,7 µs 110,8 µs (1,153× szybciej) -13,24%
unpack_sequence 37,45 ns 31,33 ns (1,195× szybciej) -16,32%
unpickle 9,764 µs 9,974 µs (1,022× wolniej) +2,15%
unpickle_list 3,154 µs 3,144 µs (1,003× szybciej) -0,31%
unpickle_pure_python 161,4 µs 123,3 µs (1,310× szybciej) -23,64%
urlsafe_base64_small 417,2 µs 235,3 µs (1,773× szybciej) -43,58%
xdsl_constant_fold 35,23 ms 31,16 ms (1,131× szybciej) -11,56%
xml_etree_generate 65,1 ms 56,4 ms (1,154× szybciej) -13,37%
xml_etree_iterparse 69,49 ms 61,14 ms (1,137× szybciej) -12,02%
xml_etree_parse 108,3 ms 103,5 ms (1,047× szybciej) -4,44%
xml_etree_process 46,24 ms 38,3 ms (1,207× szybciej) -17,17%
Wynik (średnia geometryczna) – 1,451× szybciej -31,10%

Jednostki: s — sekundy; ms — milisekundy; µs — mikrosekundy; ns — nanosekundy. W każdym wierszu oba czasy mają tę samą jednostkę. Symbol † oznacza pomiary wymagające dodatkowej ostrożności.

Wydajność według grup testów

Poniższa tabela podsumowuje testy oznaczone danym znacznikiem w pakiecie pyperformance. Grupy mogą się nakładać i nie obejmują wszystkich testów. Grupa math zawiera tylko trzy testy; nie jest podsumowaniem wszystkich obliczeń numerycznych w zestawie.

Intel Core i3-1315U — mini PC: średnia geometryczna według znaczników
Grupa (znacznik) Testy dostępne dla obu wersji Python 3.15 względem Pythona 3.14 Odpowiadająca zmiana czasu
apps 7 1,108× szybciej -9,77%
asyncio 21 1,114× szybciej -10,27%
math 3 1,204× szybciej -16,97%
regex 4 1,037× szybciej -3,60%
serialize 25 3,044× szybciej -67,15%
startup 2 1,015× szybciej -1,43%
template 2 1,196× szybciej -16,40%

Testy z wynikiem tylko dla Pythona 3.14, wyłączone z porównania: dask, genshi_text, genshi_xml, sqlalchemy_declarative, sqlalchemy_imperative. Dostarczone dane nie wyjaśniają braku tych wyników dla Pythona 3.15.

Przyspieszenie operacji kodowania

Największe zmiany tworzą wyraźny wzorzec. Uśredniony wynik base32_large wskazuje przyspieszenie około 135× na AMD i 142× na Intelu. Testy Ascii85 i Base85 dla dużych danych uzyskują przyspieszenia około 57–69×, a odpowiadające im testy dla małych danych — około 31–41×. Są to wyspecjalizowane operacje, których przyspieszenie znacznie przewyższa wyniki większości pozostałych testów.

Wzorzec ten jest zgodny z informacjami zawartymi w opisie zmian w Pythonie 3.15: implementacje Base32 oraz Ascii85/Base85 przepisano w języku C, a Base64 również zoptymalizowano. Zmiany te stanowią prawdopodobne wyjaśnienie obserwowanych przyspieszeń, chociaż pomiary nie pozwalają oddzielić wpływu poszczególnych zmian w kodzie. Testy mierzą czas wykonania, więc nie potwierdzają oszczędności pamięci.

Wpływ wyjątkowo dużych przyspieszeń kodowania na wynik ogólny
Wybór testów Przyspieszenie na AMD Przyspieszenie na Intelu
Wszystkie testy dostępne dla obu wersji 1,451× szybciej 1,451× szybciej
Bez sześciu testów Ascii85 / Base32 / Base85 1,203× szybciej 1,197× szybciej
Mediana przyspieszenia poszczególnych testów 1,184× szybciej 1,166× szybciej

Po wyłączeniu tych sześciu testów pozostaje 116 porównywalnych testów na AMD i 112 na Intelu. Średnie geometryczne współczynników przyspieszenia wynoszą odpowiednio 1,203× i 1,197×. W takim znormalizowanym podsumowaniu odpowiada to skróceniu czasu o około 17%. Jest to przydatny dodatkowy punkt odniesienia dla aplikacji, które rzadko korzystają z Base32 lub Base85.

Znaczenie wyników dla wydajności aplikacji

Grupa testów ze znacznikiem apps uzyskuje przyspieszenie około 1,13× na AMD i 1,11× na Intelu. Renderowanie szablonów przyspiesza około 1,20× na obu komputerach. Wyniki wskazują na zauważalne korzyści w niektórych zadaniach wykonywanych głównie w Pythonie. Jednocześnie pokazują, dlaczego średniego wyniku 1,45× nie można bezpośrednio przenosić na każdą aplikację.

Wyniki kodowania są zróżnicowane: dużym przyspieszeniom Base32 i Base85 towarzyszą wolniejsze operacje Base16. Podobnie grupa wyrażeń regularnych uzyskuje jedynie niewielkie przyspieszenie ogólne, podczas gdy regex_effbot działa wolniej na obu komputerach, a regex_dna — na AMD. Średnie czasy uruchamiania pozostają bliskie wynikowi referencyjnemu. Praktyczny efekt zależy od operacji wykonywanych przez aplikację.

Oficjalna dokumentacja Pythona opisuje także interpreter wykorzystujący wywołania ogonowe, stosowany w oficjalnych 64-bitowych wydaniach dla Windows. W metadanych badanych wersji zapisano różne identyfikatory kompilatora. Porównanie dotyczy kompletnych kompilacji interpretera, dlatego poszczególnych przyspieszeń nie można przypisać wyłącznie JIT, kompilatorowi ani konkretnej zmianie w interpreterze.

Oba komputery uzyskują niemal identyczny wynik dla całego zestawu, ale różnią się sprzętem i liczbą testów dostępnych dla obu wersji. Nie oznacza to większych korzyści dla któregoś producenta procesorów.

Uwagi dotyczące pomiarów

W każdej sesji pomiary danego testu są wykonywane przez 20 procesów roboczych. Dla większości testów zachowano 60 wartości czasu, a dla każdego testu uruchamiania — 200. Przy obliczaniu zbiorczych czasów średnie z poszczególnych sesji mają taką samą wagę. Wartości odstające pozostawiono w danych, a testy bez wyniku dla jednej z wersji pominięto zamiast przypisywać im wynik szacunkowy.

Symbol † jest stosowany, gdy współczynnik porównania zmienia się między sesjami o więcej niż 10%, średnie przyspieszenie zmienia się w spowolnienie lub odwrotnie albo współczynnik zmienności zestawu pomiarów przekracza 25%. Współczynnik zmienności to stosunek odchylenia standardowego do średniej, wyrażony w procentach. Oznaczenie to przyjęto na potrzeby artykułu; nie jest ono formalnym testem istotności statystycznej. Wskazuje średnie, których wielkość, a przy małych różnicach również kierunek zmiany, jest mniej wiarygodna.