Python是一门出色的语言,它让人们可以专注于想法本身,而无需被代码格式等琐事困扰。然而,Python的速度相比于C、C++等语言要慢得多,这是它的一个致命缺点。那么,当我们构建一个Python原型测试想法后,如何将其转变为快速且高性能的工具呢?通常情况下,人们会选择手动将Python代码转换为C语言代码。但如果Python原型本身就能够运行得非常快,那么我们就可以将更多的时间用在其他更有意义的事情上。
这就是PyPy的作用所在。PyPy能够让Python代码运行得比C还快。
为了证明PyPy的速度,我们使用默认的Python解释器和PyPy运行以下代码,这段代码会执行一个从0加到100,000,000的循环,然后打印出运行时间:
<code>import time from termcolor import colored start = time.time() number = 0 for i in range(100000000): number += i print(colored("FINISHED", "green")) print(f"Elapsed time: {time.time() - start} s")</code>
对比Python和PyPy的运行时间如下:
这虽然不是学术上的评估,但结果令人惊叹。与默认的Python解释器相比,需要大约10秒的时间,而PyPy只用了0.22秒就完成了执行。而且,不需要对Python代码进行任何修改,就可以直接在PyPy上运行。在同一台计算机上,等效的C语言实现需要0.32秒,PyPy甚至击败了最快的C语言实现。
那么,为什么PyPy这么快呢?
尽管代码完全相同,但执行方式却大不相同。PyPy提升速度的秘诀在于「即时编译(Just-In-Time Compilation)」,即JIT编译。
提前编译:C、C++、Swift、Haskell、Rust等语言通常采用提前编译(AOT Compilation)。编译器会将源代码转换成特定计算机架构可读的机器码,这意味着在执行程序时,执行的是机器码而不是原始源代码。
解释语言:与上述语言不同,Python、JavaScript、PHP等语言采用解释方式。在解释的过程中,源代码保持不变,解释器会逐行查看并执行代码。例如,每个Web浏览器都内置了JavaScript解释器。
即时编译:PyPy利用即时编译来执行Python代码。与解释器不同,PyPy不会逐行执行代码,而是在执行程序之前将部分代码编译成机器码。
PyPy使用的JIT编译综合了提前编译和解释的优点,既可以利用提前编译提高性能,又能保留解释型语言的灵活性和跨平台可用性。
暂无评论内容