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ń.
Zobacz również: Python 3.14 kontra Python 3.15 – test wydajności
Ś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.
| 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) |
| 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*orazasyncio.TaskGroupdo zarządzania powiązanymi zadaniami asynchronicznymi. - Python 3.10: Wprowadzono strukturalne dopasowywanie wzorców za pomocą
matchicase, adnotacje typów unii w zapisieX | Yoraz 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łzoneinfoobsł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 modulemultiprocessing. - 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.
| 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.
| 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
| 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.