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.
| 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.
| 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.
| 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.
| 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.
| 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.
| 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.