bigywater.tech
新版本特性 · 8

Python 3.15 比 3.14 快吗:18 个测试独立跑两遍,整体持平,json 更快、递归 fib 更慢,Homebrew 两个包的编译选项还不一样

“Python 3.15 比 3.14 快吗” 是升级前最常被问的问题,但答案取决于怎么构建。这篇在本机用 Homebrew 的 3.14.9 和 3.15.0 对 18 个测试各独立做两遍,交替运行取最小值,并如实列出两个构建的编译选项差异:这是在比较两个包,不是在比较两个语言版本。

1.01 / 1.03
18 个测试的几何平均比值(3.15 ÷ 3.14)两遍的结果:整体持平
1.23
递归 fib(25) 两遍的比值:这个 3.15 构建稳定地慢一些
0.86
json.dumps 第 2 遍的比值(第 1 遍 0.89):3.15 更快

先看构建

实测 · 本机执行输出
  Python 3.14.9:JIT 可用 = False,自由线程构建(Py_GIL_DISABLED) = 0,编译器 clang
      configure 选项(去掉路径类):--enable-ipv6 --enable-loadable-sqlite-extensions --enable-optimizations --with-dtrace --with-lto --with-tail-call-interp --without-ensurepip
  Python 3.15.0:JIT 可用 = False,自由线程构建(Py_GIL_DISABLED) = 0,编译器 clang
      configure 选项(去掉路径类):--enable-ipv6 --enable-loadable-sqlite-extensions --enable-optimizations --with-dtrace --with-lto --without-ensurepip
  只有 3.14.9 有的选项:--with-tail-call-interp;只有 3.15.0 有的选项:无

两个 Homebrew 包都没有 JIT、都不是自由线程构建;3.14.9 带 --with-tail-call-interp,3.15.0 不带。

纯解释器

实测 · 本机执行输出
                  3.14 ms  3.15 ms     比值1     比值2
  fib                5.01     6.18    1.23    1.23
  loop              43.09    44.62    1.04    1.04
  method            14.36    15.95    1.11    1.13
  gen               23.44    24.24    1.03    1.04

函数调用密集的 fib 和方法调用 3.15 这个构建慢一些;循环和生成器持平。

内置类型与容器

实测 · 本机执行输出
                  3.14 ms  3.15 ms     比值1     比值2
  listcomp          14.79    14.58    0.99    1.00
  dict              37.15    36.28    0.97    0.99
  sort              34.13    35.34    1.02    1.05
  str                7.50     7.76    1.05    1.03
  set               12.49    12.93    1.01    1.05
  collections        6.00     6.33    1.00    1.06

列表推导、字典、排序、字符串、集合、Counter 基本持平。

标准库

实测 · 本机执行输出
                  3.14 ms  3.15 ms     比值1     比值2
  json_dumps        15.24    13.40    0.89    0.86
  json_loads        17.06    16.05    0.94    0.94
  regex              1.90     1.83    0.97    0.95
  pickle            11.95    12.51    0.98    1.07
  sqlite            24.30    25.53    1.01    1.05
  hash               2.26     2.31    1.02    1.01

json.dumps 和 json.loads 两遍都是 3.15 更快;pickle、sqlite3 两遍结论不一致。

汇总

实测 · 本机执行输出
                  3.14 ms  3.15 ms     比值1     比值2
  bigint            11.92    11.90    1.00    1.00
  asyncio           62.08    64.71    1.01    1.04
  汇总:18 个测试的几何平均比值:第 1 遍 1.01,第 2 遍 1.03;两遍都是 3.15 快 5% 以上的有 2 个(json_dumps, json_loads);两遍都是 3.15 慢 5% 以上的有 2 个(fib, method);其余 14 个两遍结论不一致或差在 ±5% 以内(loop, gen, listcomp, dict, sort, str, set, regex, pickle, sqlite, hash, bigint, collections, asyncio)

几何平均比值 1.01 和 1.03,整体持平,不要指望升级本身带来整体加速。

分步演示

性能对比实测
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Homebrew 的 Python 3.14.9 与 3.15.0(同一台机器上两个解释器并排跑同一份代码;两者都不是自由线程构建,也都没有启用 JIT);每个例子是临时目录里的独立小脚本,用子进程运行并取真实的 stdout / stderr(路径换成 );计时用 time.perf_counter,数字每次运行会有小幅抖动。每个测试在子进程里先预热 1 次,再取 5 次里的最小值,两个版本交替运行 3 轮取最小,整个过程独立做 2 遍(表里的 ms 取两遍中最小的);数据用固定的随机种子生成,每个测试都先断言可以跑通
    • 没有验证:自由线程构建(本机没有)和启用 JIT 的构建(两个 Homebrew 包都没有开);用同样的构建选项(例如两边都带或都不带 tail-call 解释器)自行编译后的对比;pyperformance 等标准基准套件;多线程、多进程场景;内存占用;更大的数据规模;其他平台(Linux、Windows)和其他 CPU;benchmark 之间的差异原因(只量到了结果)。3.15 在 fib 上慢是不是由于缺少 tail-call 解释器,本篇没有验证
    京ICP备2026067502号-1京公网安备11010502063487号