
评论区引发了不少讨论,有粉丝称:“通过 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 编译消除。
以上就是我本地复现与实验的完整过程。
特别感谢:@费城的二鹏的投稿,
让我们有机会进行这次有趣的验证和对比。欢迎大家在评论区理性讨论,共同进步。