小伙伴们都知道,在系统的软件开发中,不仅仅是只使用一种语言,也会涉及到不同的语言。
各个语言之间有共性、也有个性。正是这些不同的个性、注定它们会用在不同的场合来解决不同类型的问题。
而编程语言在开发阶段中也会存在差异性,在软件开发这个抽象的概念下,编程语言的差异性主要体现在编码和编译以及运行上。
先来看看编译型语言定义:
编译型语言首先是将源代码编译生成机器指令,再由机器运行机器码(二进制)。也就是在运行之前,代码已经被翻译位机器码了。
再来看看解释型语言的定义:
解释型语言的源代码不是直接翻译成机器指令,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。也就是到机器码需要两个步骤,运行前先到中间码,运行时再编译成机器码。
有的小伙伴认为,虽然解释型编程语言可以让开发者更快地编写和测试代码,但仍然认为编译器是值得长期投入的。
编译型代码有两个明显的优势:
于是偏爱编译型语言的小伙伴将 Java 、 Go 和 Python通过比较在处理不同任务时的性能表现,来验证到底编译型代码的执行速度会比解释型快多少。
通过代码比较 JIT 的性能,后来使用 Python 和 Go 也实现了一遍。
这段代码计算 100 的 Fibonacci 数值,每一轮计算 50 次,并打印执行时间(纳秒),共计算 200 轮。
三种语言的输出结果看起来像这样:
平均值是这样:
可以看到,在计算 Fibonacci 数值时,Java 比 Go 要慢一些,大概慢 24%,而 Python 几乎慢了 100 倍,也就是 9458%。
这个结果验证了对 Java 和 Go 的判断,但让我们感到吃惊的是 Python 的表现,它慢得不只是一个数量级,是两个!
Python 为什么会花这么多时间。
很多人关注的是 Python 的易用性,并通过牺牲性能来快速获得处理结果。
相信数据科学家们都是这么想的,况且有这么多现成的库可以用,为什么要去找其他的?迟早会有人优化它们的。
第二个原因是很多人没有比较过不同的实现,因为很多公司在激烈的竞争中忙于做出产品,根本无暇顾及什么优化不优化。
第三个原因,有一些方式可以让同样的 Python 代码跑得更快。
PyPy 是 Python 的另一个实现,它本身就是使用 Python 开发的,包含了一个像 Java 那样的 JIT 编译器。
跟 Java 一样,我们需要忽略初始的输出,并跳过 JIT 编译过程,得到的结果如下:
PyPy 的平均响应速度比 Python 快 5 倍,但仍然比 Go 慢 20 倍。
通过执行这些简单的数学运算我们可以得出这样的结论:
Go 的执行速度比 Java 快一些,比解释运行的 Python 快 2 个数量级。
所以在高负载的关键任务上使用Python不是一个好的选择。
如果小伙伴正面临这样的情况,可以考虑使用 Python 编译器作为短期的应急方案。