观点:未编译Python代码比Go慢100倍
极客时间编辑部
讲述:丁婵大小:6.31M时长:04:36
近日,一位名叫罗德里戈·拉米雷斯(Rodrigo Ramirez)的技术人探究了编译型代码的执行速度会比解释型代码快多少,并用文章记录了他的探究过程,以下为具体内容。
每次修改代码都可以得到验证,甚至是在开始运行代码之前。
更快的执行速度,根据具体情况,代码可能被编译成非常底层的运行指令。
我之所以要写这篇文章,是想比较一下编译型代码的执行速度会比解释型快多少。因为我偏爱编译型编程语言,所以现在有个问题:我手头有很多感兴趣的代码,但它们都是用 Python 写的,我该怎么办?全部重写?部分重写?完全不重写?
先入之见
在这篇文章里,我通过比较 Java 、 Go 和 Python 在处理不同任务时的性能表现来验证我对它们的一些先入之见。首先是 Python,我正在考虑要不要把它替换掉。至于 Java,我已经是它 20 多年的粉丝了,一路看着它成熟,不管是性能还是功能都在变得更好。最后是 Go,我两年前才开始用它,但真的很喜欢它。虽然 Go 相比 Java 还缺失了一些特性,比如类继承,但 Go 的语法简洁而紧凑,编译和执行速度都很快,生成的代码也很紧凑,还提供了优雅的 goroutine 来实现并发处理。
我的先入之见是:
编译型代码的执行速度比解释型代码要快一个数量级。之前,我比较了使用 JIT 和不使用 JIT 编译 Java 代码所获得的性能,它们的比率大概是 30 比 1。
Go 的运行速度比 Java 要快一点。我记得在之前的工作中做过一些测试,发现 Go 在处理某些任务时要比 Java 快 30%,但最近一些文章又说 Java 比 Go 快。
下面就来测试,我在之前的一篇文章中通过一些代码比较过 JIT 的性能,后来使用 Python 和 Go 也实现了一遍。这段代码计算 100 的 Fibonacci 数值,每一轮计算 50 次,并打印执行时间(纳秒),共计算 200 轮。这些代码可以在 GitHub 上找到。
结果显示,在计算 Fibonacci 数值时,Java 比 Go 要慢一些,大概慢 24%,而 Python 几乎慢了 100 倍,也就是 9458%。
这个结果验证了我最初对 Java 和 Go 的判断,但 Python 的表现让我大吃一惊,它慢得不只是一个数量级,是两个。
把 Python 代码编译一下会如何
在做了一些调研之后,我决定使用 PyPy 测试一下相同的 Python 代码。PyPy 是 Python 的另一个实现,它本身就是使用 Python 开发的,包含了一个像 Java 那样的 JIT 编译器。跟 Java 一样,我们需要忽略初始的输出,并跳过 JIT 编译过程,得到的结果是:PyPy 的平均响应速度比 Python 快 5 倍,但仍然比 Go 慢 20 倍。
以上的测试主要集中在数值的计算上,如果回到最开始所说的 Python 代码,我还需要关注:Kafka、HTTP 监听器和数据库的 IO 以及解析 JSON 消息。
总结
本文通过执行简单的数学运算得出这样的结论:Go 的执行速度比 Java 快一些,比解释运行的 Python 快 2 个数量级。
基于这样的结果,我个人是不会使用 Go 来替换 Java 的。
另一方面,在高负载的关键任务上使用 Python 不是一个好的选择。如果你正面临这种情况,可以考虑使用 Python 编译器作为短期的应急方案。另外,在决定是否要重写 Python 代码时,还需要考虑到其他因素,比如 IO 和 CPU 方面的问题,但这些超出本文的范围了。
有人提醒我,使用 Go 和 Java 的 64 位整型只能准确计算出 92 的 Fibonacci 数值,再往后会出现溢出(译者:所以代码后来改成了计算 90 的 Fibonacci 数值)。但即使是这样,本文的结论仍然是有效的。
以上就是今天的内容,你是否认同拉米雷斯的观点呢?
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(4)
- 最新
- 精选
- sam为什么要拿Python和Go来此速度,使用场景也不一样吧,对于一些并不关心运行速度的需求场景呢4
- Chelizi可以对比下JavaScript和Java的速度21
- 喵星人Python是可以编译的!
- 方勇(gopher)时间复杂度,虽然是趋势,但在实际使用中,n是确定的,这样很多设计和语言有关了
收起评论