当前位置:首页>python>阅读量破 5 万+!Python 单线程性能真的超过 Java 了吗?

阅读量破 5 万+!Python 单线程性能真的超过 Java 了吗?

  • 2026-10-11 07:51:43
阅读量破 5 万+!Python 单线程性能真的超过 Java 了吗?
<摘要>
事件起因:
几天前发过一篇文章,2026年5月编程语言排行:Python份额下滑超5%,Go暴跌至第16位,目前该文章阅读已突破5W+,

评论区引发了不少讨论,有粉丝称:“通过 Demo 证实了 Python 在性能上已接近 Java,甚至在部分场景反超 Java。”(完整事件可点击上方链接查看评论区)

出于好奇,我借助 AI 工具在本地复现并运行了该 Demo,希望验证其结果。然而实际运行后发现结果存在明显差异。为此,我专门设计了一组对照实验,尝试找出并解释这些差异产生的原因。

以下内容仅代表个人观点,纯技术分享与理性探讨,不针对任何个人或群体。欢迎友好交流,共同学习。

全文有点长,纯手打,请耐心看完。


一、粉丝的Demo 、论点以及结论

1.1、原始评论(查看完整评论区,请点击上面链接。)

1.2、粉丝代码截图

我来总结一下这位粉丝朋友的 Demo 与结论:

  • Python 解释运行效率很差

  • 类型注释 + mypyc编译运行,性能可以追上或者反超 Java,也就是运行时间可以更短

代码就按照截图中的代码为基准:

  • Python 运行耗时 1.3s

  • Java 运行耗时 1.6s

  • 结论是 Python 性能持平或者反超 Java

二、我的运行结果

2.1、我的代码截图,完全与粉丝代码一致

2.2、运行结果

结果是:

Python 运行耗时 1.4s,Java 运行耗时 0.55s。

可以看到我本机环境,Python运行耗时与粉丝的运行耗时接近,而Java 远远小于粉丝的运行耗时。

我的结论是:

Java 性能远远超过 Python 性能,并且差异巨大。(1.4 / 0.55 ≈ 2.5)

但粉丝不认可这个结果,认为是我的环境有问题。

三、我的环境有问题?

3.1、AOT 编译有问题

说我的 AOT 编译、代码有问题。

说我的 py 优化不完整。

总结:

说我环境有问题或者代码有问题。

我认为这个观点不成立,我的运行结果与他的运行结果仅差 0.1s,即便以他的运行结果为准,1.3s 与 0.55s 相比依旧差异巨大。

从下面这张截图,也能看到粉丝对自己的 Java 环境也没那么自信,他说他不清楚他的容器环境是否能发挥全部 Java 性能。

我认为是他的 Java 环境有问题,导致他认为 Python 性能已经持平 Java 了。但他并不认可,并且认为是 JIT 的问题。

3.2、如果没有 GIL 锁,Demo 代码会运行的更快?

这个我就不验证了,我不觉着一个单线程代码,去掉 GIL 锁,会有什么性能提升。。。如果有大佬觉着有性能提升,欢迎评论区发截图验证,我们共同成长。

四、JIT 问题?

粉丝说是多次运行Java文件,JIT 有缓存,会导致Java运行更快。

我验证的结果是,首次运行与多次运行,耗时差异不明显:

4.1、首次运行

4.2、多次运行

可以看到耗时基本没有差异,并且为了验证 JIT 是否有影响,我还修改了 demo 测试在 for 循环内多次运行,是否有性能差异。

4.3、for 循环内多次运行demo

可以看到,第三次开始性能略有提升,但差异不明显。

我咨询了 AI 为什么 JIT 效果不明显。

结论是:

一开始因为循环次数较多,编译期已经做了 JIT 优化了,所以所谓冷启动时,JIT 已经参与优化了。

这么看他说的有道理?是 JIT 影响了实验结果吗?

我的答案是,不是的。

前面我是被粉丝朋友误导了。他要求 Python 通过 AOT 编译运行,而不能是解释运行。而 Java 没有 JIT 的情况下是解释运行。这根本是为了比较出 Python 更快而设计的实验,所以我根本不应该在 JIT 上浪费时间。本身就应该用 JIT 预热后的 Java 耗时来比较,毕竟生产环境启动后热点代码都会经过 JIT 优化。

以上,就是我在本地环境做的实验。

结论是:

粉丝的 Demo 和运行条件并不能证明 Python 的性能跟 Java 的性能接近。

反而证明,性能差异巨大。

五、性能差异的原因

从这里开始,我设计了额外的实验,验证并解释效率的差异。

5.1、用 C++ 建立性能基准

我首先需要一个基准,确认这段代码多长时间运行完成是优秀的成绩。

我用 C++ 写了这个逻辑,运行耗时作为优秀标准,大家应该没有异议吧?

5.2、运行结果

耗时比较:

  • C++ 运行耗时 0.49s

  • Java 首次运行耗时 0.55s 接近优秀

  • Java 连续多次运行耗时 0.48s 过于优秀

  • Python 运行耗时 1.3s 不及格

5.3、为什么Java 与 C++ 运行耗时接近?

我求助了AI,可以理解为 Java JIT 后运行的指令与 C++ 编译后的指令效率上很接近了。但是因为 Java 编译成原生文件比较指令集比较麻烦,我这里就不验证了。

5.4、反编译指令,解释 Python 性能差异

那么,Python 在编译成原生文件后,为什么性能还是比不上 Java 或者 C++ 呢?

我尝试用 AI 帮我反编译Python 和 C++ 的编译产物,来找到答案

结论是:

mypyc 编译的 Python so 指令复杂度显著高于 C++,主要原因是:

  • Tagged integer 机制:Python 整数必须保留任意精度语义,每次运算都有溢出检测分支

  • 引用计数:中间值都是 Python 对象,必须手动 DecRef

  • Python 对象协议:time.perf_counter()、print() 等调用要走完整的 PyObject_GetAttr + Vectorcall 路径。

六、终极总结

复现粉丝朋友 Demo 并自行设计实验后,

我的结论是:

粉丝的实验条件有问题:他的容器环境限制了 Java 性能,导致 Java 耗时虚高,得出了"Python 持平 Java"的错误结论。

公平对比下,性能差距巨大:Python mypyc AOT 编译 vs Java JIT 预热后,耗时比约为 2.3 倍(1.3s vs 0.55s)。

Java JIT 已接近 C++:JIT 预热后,Java 耗时(0.48s)与 C++ -O2 编译(0.49s)几乎持平,说明 JVM 的即时编译优化相当成熟。

Python mypyc 落后的根本原因:不是编译方式的问题,而是 Python 对象模型的固有开销——任意精度整数、引用计数、完整对象协议调用,这些无法被 AOT 编译消除。


以上就是我本地复现与实验的完整过程。

特别感谢:@费城的二鹏的投稿,

让我们有机会进行这次有趣的验证和对比。欢迎大家在评论区理性讨论,共同进步。

最新文章

随机文章