How much has Python performance changed from version 3.6 to 3.15? A comparison of ten Python versions across 122 benchmarks shows substantial reductions in execution time for many workloads, alongside tests where an earlier release records the lowest mean. The results may help students, researchers and developers understand how Python performance varies across different workloads.
Test system and Python versions
The supplied test configuration is a desktop with an AMD Ryzen 9 7900 processor, DDR5 RAM and an M.2 PCIe Gen4 NVMe drive. All interpreters are 64-bit Python builds running on Windows 11.
| Component | Configuration |
|---|---|
| Processor | AMD Ryzen 9 7900 |
| Memory | DDR5 RAM |
| Storage | M.2 PCIe Gen4 NVMe drive |
| Operating system | Windows 11 |
| Interpreter architecture | 64-bit Python builds |
| Selected benchmarks | 122 (67 measured on every version) |
| Python version | Recorded build | pyperformance release |
|---|---|---|
| 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 |
Comparability note: the result files use three releases of the pyperformance benchmark suite: 1.0.6, 1.11.0 and 1.14.0. Different suite releases were needed because newer versions of pyperformance caused compatibility issues or errors with older Python interpreters. Older suite releases were used where necessary to run the benchmarks. A shared benchmark name does not establish that its implementation or dependencies remained identical. Cross-release differences therefore cannot be attributed solely to changes in the Python interpreter.
What changed in each Python version?
The following summaries describe selected features introduced in each minor release, from Python 3.15 back to Python 3.6. These features provide historical context – their availability does not establish that they were enabled or responsible for the benchmark results.
- Python 3.15: Introduced explicit lazy imports, unpacking in comprehensions and a new profiling package that includes the Tachyon sampling profiler.
- Python 3.14: Introduced template string literals (t-strings), deferred evaluation of annotations and standard-library support for multiple interpreters.
- Python 3.13: Introduced a redesigned interactive interpreter, an experimental free-threaded build and an experimental just-in-time (JIT) compiler.
- Python 3.12: Introduced type-parameter syntax, more flexible f-strings and support for a separate global interpreter lock (GIL) in each subinterpreter.
- Python 3.11: Introduced adaptive specialization in CPython, exception groups and except*, and asyncio.TaskGroup for managing related asynchronous tasks.
- Python 3.10: Introduced structural pattern matching with match and case, union type annotations using X | Y, and clearer error messages.
- Python 3.9: Added dictionary merge operators, type annotations using built-in collections such as list[int], and the zoneinfo module for IANA time zones.
- Python 3.8: Introduced assignment expressions with the walrus operator (:=), positional-only parameters and shared-memory support in multiprocessing.
- Python 3.7: Introduced dataclasses, context variables for managing contextual state, and the built-in breakpoint() function.
- Python 3.6: Introduced formatted string literals (f-strings), variable annotations and asynchronous generators.
How the benchmark results were calculated
The analysis reads the measured samples stored in the pyperf JSON files. Calibration and warmup entries are excluded. For each benchmark, it calculates the arithmetic mean of the measured values within each Python version. Stored timing values are already normalized per benchmark loop iteration.
Only benchmarks with a recorded Python 3.15 result are included. This excludes six tests: genshi_text, genshi_xml, sqlglot_normalize, sqlglot_optimize, sqlglot_parse and sqlglot_transpile. Missing results are shown as a dash (they are not treated as zero or as failed tests).
In the tables, bold green values marked ★ identify the lowest unrounded mean in that row. Lower execution time is better. Units are stated separately for each row: ms means milliseconds and µs means microseconds. Values are rounded to four significant figures for readability. These markings describe the observed means.
Python 3.6–3.15: selected benchmark results
Table 3 presents a selection of tests available on every version, with columns ordered from Python 3.15 back to Python 3.6. It includes examples of improvements as well as workloads where Python 3.15 is not the fastest. The full 122-test table appears later in the article, so the selection can be checked against the complete dataset. Wide tables can be scrolled horizontally.
| Benchmark | Unit | 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 ★ |
The async_tree_io mean falls from 1418.8 ms on Python 3.6 to 558.8 ms on Python 3.15, a 60.6% reduction in recorded time. For json_dumps, the reduction over the same comparison is 46.1%. These are workload-specific observations, not estimates of how much faster every Python application will run.
The exceptions are equally useful. Python 3.11 records the lowest mean for json_loads, while Python 3.12 leads regex_dna. Python 3.6 has the lowest recorded startup means for the benchmark virtual environments used here – this does not establish that its interpreter initialization is intrinsically faster. For a short-lived command-line program, startup cost may matter more than the execution time of a long-running calculation. A single overall label such as “the fastest Python” would conceal these differences.
Interpreting the startup benchmark
The startup tests measure how long it takes to launch Python, run an empty command and close the process. A second test, labelled python_startup_no_site, skips the usual startup step that prepares installed packages for use. Startup time is especially relevant to small scripts that are launched frequently and finish quickly.
Python 3.6 has the lowest recorded startup times here, but the way Python is launched also matters. These benchmarks ran inside virtual environments: separate Python setups created for the tests. On Windows, newer versions can use an additional launcher to start Python from such an environment. This can add to the measured time. The official Python documentation describes this change, introduced in Python 3.7.2.
The commands used to launch Python are unchanged across the three pyperformance releases used here (1.0.6, 1.11.0 and 1.14.0). However, the recorded runs used different versions of pyperf, the library that launches the processes and measures their execution time: 2.5.0, 2.6.3 and 2.10.0, respectively. The workload was therefore the same, but the complete measurement setup was not.
Encoding benchmarks in Python 3.10-3.15
The encoding tests below have no recorded results for Python 3.6–3.9, so Table 4 compares only versions 3.10–3.15. All six use pyperformance 1.14.0. This removes the suite-release mismatch for this table.
| Benchmark | Unit | 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 |
Some recorded changes are particularly large. For base32_large, the mean is 327.6 ms on Python 3.14 and 2.431 ms on Python 3.15. Such differences merit a separate check of the benchmark implementation and execution environment before drawing conclusions about their cause. Python 3.14, meanwhile, has the lowest mean for base16_large – the newer version does not lead every encoding test.
Animated video charts
The animated video presents one benchmark at a time. Bar length is calculated as 100 × version mean ÷ the largest mean recorded for that test. The slowest measured result is therefore 100%. For instance, a result at 60% takes 40% less time than that result. It is not a 60% speed improvement.
Watch the full video:
Teal indicates faster results within a test, amber intermediate results and red slower results. Actual execution times appear alongside the bars. Each benchmark uses its own scale, so bar lengths should only be compared within the same chart.
AMD vs Intel: do the Python performance trends change?
For the broad conclusions of a Python-version comparison, the published AMD and Intel results suggest that processor choice need not substantially change the overall trend. The 2026 comparison of Python 3.14 and 3.15 reports a similar geometric mean speedup on both an AMD Ryzen 9 7900 desktop and an Intel Core i3-1315U mini PC. These figures summarize the relative improvement from Python 3.14 to 3.15 on each machine. They match after rounding, and the compared sets differ: 122 benchmarks on AMD and 118 on Intel.
The 2025 comparison of Python 3.10–3.14 also shows similar trends in several workloads across the two platforms. For example, moving from Python 3.13 to 3.14 reduces the async_tree_io time from 576 to 453 ms on AMD and from 580 to 448 ms on Intel: reductions of approximately 21% and 23%, respectively.
Taken together, these examples support similar relative performance trends on the tested systems. Absolute execution times and individual version rankings can still differ. The systems also have different memory configurations and form factors, so these comparisons do not isolate processor brand or establish statistical equivalence between AMD and Intel. Hardware-specific testing remains necessary when precise application performance matters.
Full comparison: all 122 benchmarks
The expandable table contains every selected benchmark and all ten Python versions. A star identifies the lowest recorded mean among the available values in that row. The same calculation, missing-value convention and rounding rules apply throughout.
Show all 122 benchmark results
| Benchmark | Unit | 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 |
Conclusion: benchmark the work you actually run
Python 3.15 records the lowest mean on most of the tests shared by all ten versions in this dataset. Earlier versions nevertheless lead several recorded workloads. Startup results are particularly sensitive to the launch environment, and the mixed benchmark-suite releases limit what can be inferred about interpreter changes alone. For students, researchers and developers, the practical lesson is to evaluate the workloads that matter to their own projects and report both the results and the conditions under which they were measured.