Jak bardzo zmieniła się wydajność Pythona między wersjami 3.6 a 3.15? Porównanie dziesięciu wersji języka w 122 testach wydajności pokazuje, że w wielu zastosowaniach czas wykonania znacznie się skrócił. Są jednak również testy, w których najniższą średnią uzyskała jedna z wcześniejszych wersji. Wyniki te mogą pomóc studentom, badaczom i programistom zrozumieć, jak wydajność Pythona zależy od rodzaju wykonywanych zadań.

Środowisko testowe i wersje Pythona

Testy przeprowadzono na komputerze stacjonarnym z procesorem AMD Ryzen 9 7900, pamięcią RAM DDR5 i dyskiem M.2 NVMe PCIe Gen4. Wszystkie testowane interpretery to 64-bitowe wersje Pythona działające w systemie Windows 11.

Tabela 1. Konfiguracja środowiska testowego.
Podzespół Konfiguracja
Procesor AMD Ryzen 9 7900
Pamięć RAM DDR5
Dysk Dysk M.2 NVMe PCIe Gen4
System operacyjny Windows 11
Architektura interpretera 64-bitowe wersje Pythona
Uwzględnione testy wydajności 122 (67 przeprowadzonych we wszystkich wersjach)
Tabela 2. Wersje testowanych interpreterów i zestawu pyperformance, od najnowszych. Każde dokładne oznaczenie wersji zawiera odnośnik do oficjalnej strony wydania w serwisie python.org.
Wersja Pythona Testowana wersja Wersja pyperformance
Python 3.15 3.15.0 1.14.0
Python 3.14 3.14.8 1.14.0
Python 3.13 3.13.16 1.14.0
Python 3.12 3.12.10 1.14.0
Python 3.11 3.11.9 1.14.0
Python 3.10 3.10.11 1.14.0
Python 3.9 3.9.13 1.11.0
Python 3.8 3.8.10 1.11.0
Python 3.7 3.7.9 1.0.6
Python 3.6 3.6.8 1.0.6

Uwaga dotycząca porównywalności wyników: pliki z wynikami pochodzą z trzech wersji zestawu testów pyperformance: 1.0.6, 1.11.0 i 1.14.0. Korzystanie z różnych wersji było konieczne, ponieważ nowsze wydania pyperformance powodowały problemy ze zgodnością lub błędy podczas pracy ze starszymi interpreterami Pythona. Tam, gdzie było to potrzebne, zastosowano więc starsze wydania zestawu testów. Sama zgodność nazwy testu nie oznacza, że jego implementacja i zależności pozostały niezmienione. Dlatego różnic między wynikami uzyskanymi przy użyciu różnych wydań zestawu testów nie można przypisywać wyłącznie zmianom w interpreterze Pythona.

Co zmieniło się w poszczególnych wersjach Pythona?

Poniżej przedstawiono wybrane funkcje wprowadzone w kolejnych wersjach Pythona, od 3.15 do 3.6. Informacje te stanowią kontekst historyczny. Sama obecność danej funkcji nie oznacza, że była ona włączona podczas testów ani że wpłynęła na uzyskane wyniki.

  • Python 3.15: Wprowadzono jawne importy opóźnione, rozpakowywanie wartości w wyrażeniach składanych oraz nowy pakiet do profilowania, zawierający profiler próbkowy Tachyon.
  • Python 3.14: Wprowadzono szablonowe literały łańcuchowe (t-strings), odroczone obliczanie adnotacji oraz obsługę wielu interpreterów w bibliotece standardowej.
  • Python 3.13: Wprowadzono przebudowany interpreter interaktywny, eksperymentalny wariant Pythona umożliwiający pracę wielowątkową bez GIL oraz eksperymentalny kompilator JIT (just-in-time).
  • Python 3.12: Wprowadzono składnię parametrów typów, bardziej elastyczny zapis f-stringów oraz możliwość korzystania z osobnej globalnej blokady interpretera (GIL) w każdym podinterpreterze.
  • Python 3.11: Wprowadzono adaptacyjną specjalizację kodu w CPythonie, grupy wyjątków i składnię except* oraz asyncio.TaskGroup do zarządzania powiązanymi zadaniami asynchronicznymi.
  • Python 3.10: Wprowadzono strukturalne dopasowywanie wzorców za pomocą match i case, adnotacje typów unii w zapisie X | Y oraz czytelniejsze komunikaty o błędach.
  • Python 3.9: Dodano operatory łączenia słowników, adnotacje typów korzystające z wbudowanych kolekcji, np. list[int], oraz moduł zoneinfo obsługujący strefy czasowe IANA.
  • Python 3.8: Wprowadzono wyrażenia przypisania z operatorem morsa (:=), parametry wyłącznie pozycyjne oraz obsługę pamięci współdzielonej w module multiprocessing.
  • Python 3.7: Wprowadzono klasy danych (dataclasses), zmienne kontekstowe do zarządzania stanem zależnym od kontekstu oraz wbudowaną funkcję breakpoint().
  • Python 3.6: Wprowadzono formatowane literały łańcuchowe (f-stringi), adnotacje zmiennych oraz generatory asynchroniczne.

Sposób obliczania wyników testów wydajności

W analizie wykorzystano próbki pomiarowe zapisane w plikach JSON narzędzia pyperf. Pominięto dane pochodzące z kalibracji i fazy rozgrzewania. Dla każdego testu obliczono średnią arytmetyczną zmierzonych wartości w obrębie danej wersji Pythona. Czasy zapisane w plikach zostały już przeliczone na pojedynczą iterację pętli testowej.

Uwzględniono wyłącznie testy, dla których dostępny jest wynik Pythona 3.15. Oznacza to wykluczenie sześciu testów: genshi_text, genshi_xml, sqlglot_normalize, sqlglot_optimize, sqlglot_parse i sqlglot_transpile. Brakujące wyniki oznaczono myślnikiem (nie traktowano ich jako wartości zerowych ani nieudanych testów).

W tabelach pogrubione zielone wartości oznaczone gwiazdką ★ wskazują najniższą średnią w danym wierszu, ustaloną przed zaokrągleniem. Im krótszy czas wykonania, tym lepszy wynik. Jednostkę podano osobno dla każdego wiersza: ms oznacza milisekundy, a µs – mikrosekundy. Dla czytelności wartości zaokrąglono do czterech cyfr znaczących. Wyróżnienia odnoszą się do zaobserwowanych średnich.

Python 3.6–3.15: wybrane wyniki testów

Tabela 3 przedstawia wybrane testy, dla których dostępne są wyniki wszystkich dziesięciu wersji Pythona. Kolumny uporządkowano od wersji 3.15 do 3.6. Pokazano zarówno przykłady poprawy wydajności, jak i zadania, w których Python 3.15 nie uzyskał najlepszego wyniku. W dalszej części artykułu znajduje się pełna tabela obejmująca 122 testy, która umożliwia sprawdzenie tych przykładów na tle całego zestawu danych. Szerokie tabele można przewijać w poziomie.

Tabela 3. Wybrane testy przeprowadzone we wszystkich dziesięciu wersjach. ★ = najniższa zarejestrowana średnia w danym wierszu.
Test Jednostka Python 3.15 Python 3.14 Python 3.13 Python 3.12 Python 3.11 Python 3.10 Python 3.9 Python 3.8 Python 3.7 Python 3.6
async_tree_io ms 558,8 ★ 617,5 577,6 864,9 964,0 1321 1342 1353 1340 1419
deltablue ms 1,669 ★ 2,508 2,249 2,401 2,576 4,298 4,004 4,060 4,441 5,260
dulwich_log ms 44,74 ★ 48,84 47,16 50,01 49,22 58,85 59,76 58,69 64,96 65,13
fannkuch ms 208,5 ★ 280,5 251,0 243,7 237,4 259,9 254,6 264,9 300,1 304,3
json_dumps ms 4,862 ★ 6,731 6,180 5,920 7,629 8,065 8,268 8,332 8,793 9,014
json_loads µs 13,06 14,53 14,62 14,33 12,79 ★ 13,34 13,98 15,08 16,56 17,48
nbody ms 62,13 ★ 89,91 81,61 81,79 72,83 89,64 83,77 77,54 97,39 96,01
richards ms 22,75 ★ 31,37 30,20 27,37 29,19 41,73 38,45 39,53 42,26 50,17
spectral_norm ms 52,58 ★ 77,96 74,42 75,18 73,23 81,42 80,50 80,31 99,75 97,18
regex_dna ms 118,7 107,9 105,8 99,72 ★ 101,0 110,0 107,5 113,7 122,7 121,4
python_startup ms 34,36 35,18 24,99 33,05 36,57 24,15 33,62 24,13 26,80 23,04 ★
python_startup_no_site ms 29,23 29,09 19,93 27,34 26,76 19,83 28,93 19,81 23,32 18,62 ★

W teście async_tree_io średni czas wykonania spadł z 1418,8 ms w Pythonie 3.6 do 558,8 ms w Pythonie 3.15, czyli o 60,6%. W teście json_dumps skrócenie czasu w tym samym porównaniu wyniosło 46,1%. Wyniki te dotyczą konkretnych obciążeń i nie oznaczają, że każda aplikacja napisana w Pythonie będzie działała odpowiednio szybciej.

Równie interesujące są wyjątki. Python 3.11 uzyskał najniższą średnią w teście json_loads, a Python 3.12 – w teście regex_dna. Python 3.6 osiągnął najkrótsze średnie czasy uruchamiania w wykorzystanych tu środowiskach wirtualnych. Nie dowodzi to jednak, że sam interpreter tej wersji uruchamia się z natury szybciej. W przypadku krótkiego programu uruchamianego z wiersza poleceń czas startu może mieć większe znaczenie niż czas wykonywania długotrwałych obliczeń. Określenie jednej wersji mianem „najszybszego Pythona” zacierałoby te różnice.

Jak interpretować wyniki testu czasu uruchamiania Pythona?

Testy uruchamiania mierzą czas potrzebny na uruchomienie Pythona, wykonanie pustego polecenia i zakończenie procesu. Drugi test, oznaczony jako python_startup_no_site, pomija standardowy etap uruchamiania związany z przygotowaniem środowiska do korzystania z zainstalowanych pakietów. Czas startu ma szczególne znaczenie dla niewielkich skryptów, które są często uruchamiane i szybko kończą działanie.

Python 3.6 uzyskał tu najkrótsze czasy uruchamiania, ale znaczenie ma również sposób uruchamiania interpretera. Testy wykonywano w środowiskach wirtualnych, czyli odrębnych środowiskach Pythona utworzonych na potrzeby pomiarów. W systemie Windows nowsze wersje mogą korzystać z dodatkowego programu uruchamiającego interpreter z takiego środowiska, co może wydłużać zmierzony czas. Zmianę tę, wprowadzoną w Pythonie 3.7.2, opisuje oficjalna dokumentacja Pythona.

Polecenia służące do uruchamiania Pythona pozostały niezmienione we wszystkich trzech wykorzystanych wersjach pakietu pyperformance (1.0.6, 1.11.0 i 1.14.0). Jednak w poszczególnych pomiarach użyto różnych wersji biblioteki pyperf, odpowiedzialnej za uruchamianie procesów i mierzenie czasu ich wykonania: odpowiednio 2.5.0, 2.6.3 i 2.10.0. Oznacza to, że zakres wykonywanych operacji był taki sam, ale całe środowisko pomiarowe nie było identyczne.

Testy kodowania danych w Pythonie 3.10–3.15

Dla testów kodowania danych przedstawionych poniżej nie ma wyników Pythona 3.6–3.9, dlatego tabela 4 porównuje jedynie wersje 3.10–3.15. We wszystkich sześciu wersjach Pythona zastosowano pyperformance 1.14.0. W tym przypadku wyniki nie są więc obciążone różnicą wersji zestawu testów.

Tabela 4. Wybrane testy kodowania danych. ★ = najniższa zarejestrowana średnia spośród wersji Pythona 3.10–3.15.
Test Jednostka Python 3.15 Python 3.14 Python 3.13 Python 3.12 Python 3.11 Python 3.10
ascii85_large ms 11,62 ★ 797,9 709,0 772,3 643,8 759,2
ascii85_small ms 0,3875 ★ 14,88 13,20 13,79 12,18 14,18
base16_large ms 5,767 4,714 ★ 22,52 23,08 23,89 23,71
base32_large ms 2,431 ★ 327,6 300,7 296,4 265,7 292,1
base32_small ms 0,1630 ★ 6,227 5,802 5,594 5,134 5,641
base64_large ms 1,852 ★ 6,746 6,187 6,095 6,116 6,071
base85_large ms 4,293 ★ 272,4 252,9 258,8 230,1 259,2
base85_small ms 0,1505 ★ 4,864 4,484 4,529 4,198 4,712

Niektóre odnotowane różnice są szczególnie duże. W teście base32_large średni czas wyniósł 327,6 ms w Pythonie 3.14 i 2,431 ms w Pythonie 3.15. Przed wyciągnięciem wniosków o przyczynach tak dużej różnicy warto osobno zweryfikować implementację testu i środowisko jego wykonania. Z kolei Python 3.14 uzyskał najniższą średnią w teście base16_large – nowsza wersja nie wygrywa więc we wszystkich testach kodowania danych.

Animowane wykresy wideo

Animacja pokazuje kolejne testy wydajności, po jednym naraz. Długość słupka obliczono według wzoru: 100 × średni czas danej wersji ÷ największy średni czas uzyskany w danym teście. Najwolniejszy wynik ma zatem wartość 100%. Jeśli słupek ma długość 60%, oznacza to czas wykonania krótszy o 40% od najwolniejszego wyniku, a nie poprawę szybkości o 60%.

Obejrzyj cały film:

Kolor turkusowy oznacza szybsze wyniki w danym teście, bursztynowy – pośrednie, a czerwony – wolniejsze. Obok słupków podano rzeczywiste czasy wykonania. Każdy test ma własną skalę, dlatego długości słupków należy porównywać wyłącznie w obrębie tego samego wykresu.

AMD kontra Intel: czy trendy wydajności Pythona są podobne?

Z opublikowanych wyników dla procesorów AMD i Intel wynika, że wybór procesora nie musi istotnie zmieniać ogólnych trendów widocznych przy porównywaniu wersji Pythona. Porównanie Pythona 3.14 i 3.15 z 2026 roku wykazało geometryczną średnią przyspieszenia na podobnym poziomie zarówno na komputerze stacjonarnym z AMD Ryzen 9 7900, jak i na minikomputerze z Intel Core i3-1315U. Wartości te podsumowują względną poprawę wydajności Pythona 3.15 względem wersji 3.14 na każdym z komputerów. Są jednakowe po zaokrągleniu, ale zestawy testów nie były identyczne: na AMD przeprowadzono 122 testy, a na Intelu – 118.

Porównanie Pythona 3.10–3.14 z 2025 roku również pokazuje podobne tendencje w kilku rodzajach obciążeń na obu platformach. Przykładowo przejście z Pythona 3.13 na 3.14 skróciło czas w teście async_tree_io z 576 do 453 ms na AMD oraz z 580 do 448 ms na Intelu, czyli odpowiednio o około 21% i 23%.

Łącznie przykłady te wskazują na podobne względne trendy wydajności na obu badanych komputerach. Bezwzględne czasy wykonania i kolejność wersji Pythona w poszczególnych testach mogą się jednak różnić. Komputery różnią się też konfiguracją pamięci i konstrukcją, dlatego takie porównania nie pozwalają wyodrębnić wpływu samej marki procesora ani stwierdzić statystycznej równoważności wyników AMD i Intela. Jeśli istotna jest dokładna wydajność konkretnej aplikacji, nadal potrzebne są testy na docelowym sprzęcie.

Pełne porównanie: wszystkie 122 testy

Rozwijana tabela zawiera wszystkie 122 uwzględnione testy i wyniki dziesięciu wersji Pythona. Gwiazdka oznacza najniższą z dostępnych średnich w danym wierszu. W całym zestawieniu zastosowano ten sam sposób obliczania wyników, oznaczania brakujących wartości i zaokrąglania liczb.

Pokaż wyniki wszystkich 122 testów
Tabela 5. Pełny zestaw wyników 122 testów. ★ oznacza najniższą zarejestrowaną średnią, a myślnik – brak wyniku.
Test Jednostka Python 3.15 Python 3.14 Python 3.13 Python 3.12 Python 3.11 Python 3.10 Python 3.9 Python 3.8 Python 3.7 Python 3.6
2to3 ms 207,6 229,3 205,0 ★ 223,0 212,4 243,5 244,1 233,3 239,4 245,8
ascii85_large ms 11,62 ★ 797,9 709,0 772,3 643,8 759,2 — — — —
ascii85_small ms 0,3875 ★ 14,88 13,20 13,79 12,18 14,18 — — — —
async_generators ms 237,9 269,8 245,9 246,6 194,2 ★ 233,8 222,7 225,1 239,1 —
async_tree_cpu_io_mixed ms 393,4 ★ 420,2 408,3 520,8 564,7 688,5 686,8 687,6 684,0 736,0
async_tree_cpu_io_mixed_tg ms 380,8 ★ 404,4 424,8 517,1 518,0 — — — — —
async_tree_eager ms 98,19 124,2 77,12 70,41 ★ — — — — — —
async_tree_eager_cpu_io_mixed ms 322,5 349,0 305,3 304,9 ★ — — — — — —
async_tree_eager_cpu_io_mixed_tg ms 342,9 ★ 365,3 374,0 430,9 — — — — — —
async_tree_eager_io ms 588,9 ★ 652,8 656,7 1007 — — — — — —
async_tree_eager_io_tg ms 558,3 ★ 610,1 658,6 922,1 — — — — — —
async_tree_eager_memoization ms 170,7 190,5 179,3 170,2 ★ — — — — — —
async_tree_eager_memoization_tg ms 224,0 ★ 243,9 239,1 312,0 — — — — — —
async_tree_eager_tg ms 166,3 ★ 184,9 181,0 222,9 — — — — — —
async_tree_io ms 558,8 ★ 617,5 577,6 864,9 964,0 1321 1342 1353 1340 1419
async_tree_io_tg ms 511,6 ★ 581,5 594,1 897,2 938,2 — — — — —
async_tree_memoization ms 278,0 ★ 308,5 298,0 414,1 434,5 576,2 571,4 557,1 566,9 629,2
async_tree_memoization_tg ms 240,1 ★ 267,1 308,4 383,2 403,2 — — — — —
async_tree_none ms 225,8 ★ 248,5 244,0 312,6 380,6 474,1 485,7 461,8 471,4 554,3
async_tree_none_tg ms 194,4 ★ 215,4 220,6 293,5 306,4 — — — — —
asyncio_tcp ms 435,2 ★ 458,4 441,2 459,3 604,9 754,9 618,0 671,8 — —
asyncio_tcp_ssl ms 1219 ★ 1258 1251 1253 1317 2033 1754 1843 — —
asyncio_websockets ms 125,6 ★ 141,6 452,9 456,7 455,5 458,1 — — — —
base16_large ms 5,767 4,714 ★ 22,52 23,08 23,89 23,71 — — — —
base16_small µs 308,3 252,3 ★ 522,2 515,2 552,0 605,3 — — — —
base32_large ms 2,431 ★ 327,6 300,7 296,4 265,7 292,1 — — — —
base32_small ms 0,1630 ★ 6,227 5,802 5,594 5,134 5,641 — — — —
base64_large ms 1,852 ★ 6,746 6,187 6,095 6,116 6,071 — — — —
base64_small µs 169,2 ★ 219,5 204,4 197,2 200,7 245,4 — — — —
base85_large ms 4,293 ★ 272,4 252,9 258,8 230,1 259,2 — — — —
base85_small ms 0,1505 ★ 4,864 4,484 4,529 4,198 4,712 — — — —
bench_mp_pool ms 112,0 126,0 118,1 123,2 98,84 98,60 70,91 68,98 ★ 109,8 110,6
bench_thread_pool ms 0,6588 ★ 0,7389 0,6954 0,7138 0,7202 0,7721 0,7480 0,7616 109,5 109,8
bpe_tokeniser ms 2318 ★ 2968 2872 3112 2710 2962 — — — —
chameleon ms 8,428 9,954 9,834 8,770 8,890 10,32 — 6,593 ★ 6,986 7,623
chaos ms 31,30 ★ 44,06 40,48 43,34 44,41 58,37 57,75 59,67 70,34 76,81
comprehensions µs 8,117 ★ 12,20 10,70 13,28 13,41 14,73 13,95 14,30 — —
connected_components ms 365,8 388,3 359,4 351,3 ★ 406,9 — — — — —
coroutines ms 12,87 ★ 17,05 14,40 15,38 16,31 17,75 21,04 22,33 22,47 20,61
coverage ms 48,64 52,53 48,59 27,71 37,07 34,36 25,66 25,78 24,54 ★ —
create_gc_cycles ms 0,8892 1,030 1,005 1,004 0,9392 0,9490 0,6352 0,6044 ★ — —
crypto_pyaes ms 39,17 ★ 50,48 48,82 48,91 45,69 64,55 61,67 65,92 71,65 75,32
dask ms 687,5 720,2 732,9 472,2 — — 274,7 273,4 ★ — —
deepcopy µs 129,9 ★ 174,8 223,6 218,3 219,5 256,3 245,7 250,0 298,9 —
deepcopy_memo µs 14,64 ★ 19,74 25,02 24,80 24,81 29,56 28,56 28,79 35,50 —
deepcopy_reduce µs 1,541 ★ 1,899 2,122 1,976 1,949 2,246 2,219 2,244 2,729 —
deltablue ms 1,669 ★ 2,508 2,249 2,401 2,576 4,298 4,004 4,060 4,441 5,260
django_template ms 20,47 ★ 24,56 22,44 22,51 21,89 28,25 — — 35,62 45,57
docutils ms 1272 ★ 1425 1418 1453 1416 1654 1598 1569 1709 1795
dulwich_log ms 44,74 ★ 48,84 47,16 50,01 49,22 58,85 59,76 58,69 64,96 65,13
fannkuch ms 208,5 ★ 280,5 251,0 243,7 237,4 259,9 254,6 264,9 300,1 304,3
fastapi_http ms 399,9 ★ 454,7 431,1 480,7 456,6 517,2 — — — —
float ms 44,02 ★ 57,28 55,06 58,57 52,96 66,99 67,17 66,56 81,47 81,81
gc_traversal ms 1,682 1,807 1,802 1,711 1,635 1,516 1,211 ★ 1,373 — —
generators ms 16,29 ★ 23,32 21,48 23,35 39,08 42,54 32,71 34,39 32,56 —
go ms 59,34 ★ 89,44 89,62 88,20 92,64 132,0 141,1 139,6 144,5 171,1
hexiom ms 3,178 ★ 4,914 4,250 4,447 4,162 5,431 5,223 5,411 5,979 6,971
html5lib ms 28,44 ★ 33,73 33,51 32,67 31,41 39,83 41,80 41,45 46,72 53,20
json_dumps ms 4,862 ★ 6,731 6,180 5,920 7,629 8,065 8,268 8,332 8,793 9,014
json_loads µs 13,06 14,53 14,62 14,33 12,79 ★ 13,34 13,98 15,08 16,56 17,48
k_core ms 1616 ★ 1708 1670 1902 2137 — — — — —
logging_format µs 5,081 ★ 6,286 6,031 6,376 6,290 6,900 6,231 6,361 7,385 8,474
logging_silent µs 0,05126 ★ 0,07505 0,07002 0,06615 0,06868 0,1033 0,1055 0,1041 0,1075 0,2096
logging_simple µs 4,720 ★ 5,845 5,587 5,986 5,923 6,560 5,818 5,968 6,794 7,618
mako ms 6,643 ★ 7,970 6,737 7,294 7,317 8,889 9,808 10,17 12,65 13,78
many_optionals µs 297,7 ★ 386,7 368,9 367,0 367,5 404,8 — — — —
mdp ms 661,3 ★ 829,3 1646 1667 1565 1659 1777 1642 1840 1780
meteor_contest ms 60,92 ★ 69,78 66,52 64,18 64,78 65,08 62,60 64,01 69,52 72,23
nbody ms 62,13 ★ 89,91 81,61 81,79 72,83 89,64 83,77 77,54 97,39 96,01
nqueens ms 43,38 ★ 65,02 58,66 59,45 58,23 60,58 56,92 60,47 66,51 68,16
pathlib ms 228,7 232,9 232,0 232,0 220,3 222,0 219,6 219,3 217,8 ★ 219,7
pickle µs 7,807 7,953 8,085 7,334 6,681 ★ 6,784 6,906 6,706 9,743 8,021
pickle_dict µs 17,69 ★ 20,50 19,16 19,49 18,45 18,76 17,90 17,83 26,59 20,84
pickle_list µs 2,820 3,041 2,869 2,804 2,600 2,576 2,517 ★ 2,547 3,583 2,875
pickle_pure_python µs 175,2 ★ 217,3 190,2 194,9 189,0 254,6 250,9 256,6 293,9 331,2
pidigits ms 128,8 129,7 129,7 135,0 136,1 136,9 139,2 136,1 124,4 ★ 128,3
pprint_pformat ms 831,6 ★ 1034 1006 1008 965,7 1172 903,7 908,7 1020 1115
pprint_safe_repr ms 413,3 ★ 502,5 506,7 486,7 469,7 566,1 — — — —
pyflate ms 239,9 ★ 323,0 303,0 304,3 285,6 389,1 394,1 397,2 443,3 481,4
python_startup ms 34,36 35,18 24,99 33,05 36,57 24,15 33,62 24,13 26,80 23,04 ★
python_startup_no_site ms 29,23 29,09 19,93 27,34 26,76 19,83 28,93 19,81 23,32 18,62 ★
raytrace ms 144,0 ★ 192,8 176,1 195,3 192,9 272,7 266,2 273,1 302,7 358,0
regex_compile ms 54,30 ★ 75,55 73,19 79,10 74,54 90,70 86,59 89,70 102,6 109,1
regex_dna ms 118,7 107,9 105,8 99,72 ★ 101,0 110,0 107,5 113,7 122,7 121,4
regex_effbot ms 1,940 1,588 1,565 1,509 ★ 1,581 1,786 1,819 1,893 2,097 1,892
regex_v8 ms 15,13 14,92 15,03 13,69 ★ 14,16 15,35 16,51 15,16 17,59 17,62
richards ms 22,75 ★ 31,37 30,20 27,37 29,19 41,73 38,45 39,53 42,26 50,17
richards_super ms 26,14 ★ 35,52 34,13 30,93 36,03 50,83 48,11 47,65 — —
scimark_fft ms 163,4 ★ 217,5 207,4 218,4 206,3 221,5 217,6 206,3 252,7 234,0
scimark_lu ms 54,56 ★ 77,23 70,77 74,08 65,88 92,71 90,00 88,69 105,2 140,0
scimark_monte_carlo ms 36,72 ★ 48,66 45,22 47,18 43,48 59,02 58,02 58,99 61,12 72,85
scimark_sor ms 62,58 ★ 93,32 83,76 90,14 78,83 103,4 105,7 103,0 115,4 139,3
scimark_sparse_mat_mult ms 2,504 ★ 3,372 3,225 3,379 3,200 3,530 3,149 3,059 3,498 3,177
shortest_path ms 372,7 397,5 370,4 360,0 ★ 407,7 — — — — —
spectral_norm ms 52,58 ★ 77,96 74,42 75,18 73,23 81,42 80,50 80,31 99,75 97,18
sphinx ms 552,5 ★ 617,7 591,2 610,0 624,3 — — — — —
sqlalchemy_declarative ms 54,38 ★ 61,12 64,18 67,42 67,76 77,65 72,58 72,28 82,56 80,96
sqlalchemy_imperative ms 5,959 ★ 6,798 6,865 6,966 6,914 8,431 8,549 8,320 9,762 9,374
sqlglot_v2_normalize ms 58,48 ★ 71,32 69,04 66,67 67,85 79,88 — — — —
sqlglot_v2_optimize ms 27,93 ★ 33,61 32,29 32,42 31,75 37,03 — — — —
sqlglot_v2_parse ms 0,6214 ★ 0,8693 0,7941 0,8246 0,8752 1,144 — — — —
sqlglot_v2_transpile ms 0,7834 ★ 1,050 0,9646 1,010 1,045 1,362 — — — —
sqlite_synth µs 1,370 1,523 1,507 1,516 1,341 ★ 1,532 1,648 1,829 1,785 1,955
subparsers ms 5,747 ★ 6,756 18,20 45,06 39,63 45,51 — — — —
sympy_expand ms 220,0 ★ 258,3 248,8 240,2 244,4 267,3 263,4 255,0 345,9 329,7
sympy_integrate ms 9,662 ★ 11,35 11,27 11,35 11,49 12,69 12,57 12,26 16,00 15,85
sympy_str ms 124,8 ★ 149,4 144,6 147,7 149,1 161,0 158,4 155,2 198,0 198,5
sympy_sum ms 66,41 ★ 78,46 76,69 79,50 84,24 90,98 87,22 86,32 102,5 106,8
telco ms 4,111 4,940 5,039 4,170 4,006 3,850 3,710 ★ 3,742 4,727 4,548
tomli_loads ms 1023 ★ 1585 1423 1557 1396 1679 1591 1619 — —
tornado_http ms 93,48 ★ 99,88 99,31 101,5 102,7 120,4 116,4 114,9 121,8 125,6
typing_runtime_protocols µs 88,07 ★ 107,0 100,3 101,5 290,5 311,7 300,5 311,7 — —
unpack_sequence µs 0,03101 ★ 0,04821 0,05086 0,04959 0,03492 0,04418 0,04135 0,04645 0,04103 0,04253
unpickle µs 8,827 8,886 9,203 8,857 7,641 ★ 8,418 8,004 9,646 9,542 9,697
unpickle_list µs 2,865 2,806 3,067 3,118 2,530 ★ 2,911 2,937 2,714 2,616 2,684
unpickle_pure_python µs 116,6 ★ 157,6 140,4 143,1 144,8 177,0 171,1 178,5 224,8 239,9
urlsafe_base64_small µs 206,1 ★ 340,4 316,2 305,1 312,3 412,5 — — — —
xdsl_constant_fold ms 20,97 ★ 24,33 24,03 23,15 23,30 29,74 — — — —
xml_etree_generate ms 50,36 ★ 59,89 58,41 58,83 51,97 55,29 53,82 57,17 67,46 68,77
xml_etree_iterparse ms 47,99 ★ 54,90 56,85 56,13 57,18 58,15 54,40 54,66 60,31 62,17
xml_etree_parse ms 77,91 80,08 81,16 75,08 ★ 80,35 81,05 83,62 84,17 92,31 89,00
xml_etree_process ms 34,81 ★ 42,23 40,30 40,51 37,55 44,00 42,61 44,74 54,81 56,71

Wnioski: testuj wydajność w rzeczywistych zastosowaniach

Python 3.15 uzyskał najniższą średnią w większości testów dostępnych dla wszystkich dziesięciu wersji w tym zestawie danych. W kilku rodzajach obciążeń lepiej wypadły jednak wcześniejsze wersje. Wyniki testów uruchamiania są szczególnie wrażliwe na konfigurację środowiska, a użycie różnych wersji zestawu testów ogranicza możliwość przypisania różnic wyłącznie zmianom w interpreterze. Dla studentów, badaczy i programistów najważniejszy wniosek jest praktyczny: warto mierzyć wydajność zadań istotnych dla własnych projektów, a następnie podawać zarówno wyniki, jak i warunki, w których je uzyskano.