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.

Table 1. Supplied test configuration.
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)
Table 2. Recorded interpreter builds and benchmark-suite releases, newest first. Each exact build links to its official python.org release page.
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.

Table 3. Selected benchmarks measured across all ten versions. ★ = lowest recorded mean in the row.
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.

Table 4. Selected encoding benchmarks. ★ = lowest recorded mean among Python 3.10–3.15.
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
Table 5. Complete dataset of 122 benchmarks. ★ shows the lowest recorded mean, a dash shows that there is no recorded result.
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.