“If you want your code to run faster, you should probably just use PyPy.” — Guido van Rossum (Creator of Python)
什么是 Pypy?
简单来说,Pypy
就是用Python
实现Python
(禁止套娃)。是的没看错,Pypy
就是用Python
实现Python
。
看到这里,你应该会有疑问?这不是多此一举吗?(套娃?)其实不然,我们先来看这几组数据
我们用同样的代码,分别使用Python
和Pypy
,在 在线IDE 下运行,查看其运行速度
Python
代码为:
NUM =111181111
def is_prime(n):
i =2
while i < n:
if n % i == 0:
return False
i += 1
return True
print (is_prime(NUM))
C++
代码为:
#include <bits/stdc++.h>
using namespace std;
int main(){
int num = 111181111;
for (int i = 2; i < num; i ++) {
if (num % i ==0) {
printf("False");
return 0;
}
}
printf("True");
return 0;
}
Pypy3
的时间为:1127ms
,如下图:
Python3
的时间为:TLE(超时)
,如下图:
而C++
的时间为:315ms
(不开启O2优化
的情况下),开启O2优化
能达到252ms
(C++ yyds!),如下图:
根据测试结果,很显然Pypy
的速度明显高于Python
。
你们也可以直接使用下面这段代码尝试一下
import time
start_time = time.time()
number = 0
for i in range(100000000):
number += i
print(f"Ellapsed time: {time.time() - start_time} s")
等效C++
代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int num = 0;
double start_time = clock();
for (int i = 0; i < 100000000; i ++) {
num ++;
}
printf("Ellapsed time: %0.9f s", (double)(clock()- start_time) / CLOCKS_PER_SEC);
return 0;
}
为什么 Pypy
的速度快于 Python
?
这个要追溯到 Python
的实现了。众所周知,Python
是解释型编程语言
,说人话就是代码是一行一行运行的。这样做的好处就是代码可以立即运行,不需要经过编译等步骤(※PS:如果你编译过 Linux内核
你就知道,等待编译的过程的痛苦了),而且具有良好的可移植性、兼容性、跨平台可用性。但解释型编程语言
的坏处显而易见,就是慢,相比于编译型编程语言
运行速度慢。
这是因为解释型编程语言
在运行的时候需要有解释器
来将代码翻译成机器语言
,让机器去运行。简单来说就是编译的过程在运行过程中完成了。因此,解释型编程语言
的运行速度就相对来说比较慢。
而我们平常使用的Python
,也就是官网下载的Python
,使用的解释器是CPython
,也就是用C
实现的Python解释器
,而Pypy
是 用 Python
实现的Python解释器
。同样的,也有用Java
实现的Python
,叫Jython
,而C#
实现的叫IronPython
……
回到话题上,为什么Pypy
能比CPython
快,是因为Pypy
使用了一种名叫JIT
的技术。JIT
的全称叫做即时编译( just-in-time compilation)
。运行的时候,PyPy
是利用即时编译来执行 Python 代码的。即PyPy
不同于解释器,它并不会逐行运行代码,而是在执行程序前先将部分代码编译成机器码。PyPy
使用的JIT
编译是解释和提前编译的结合,可以利用提前编译来提高性能,并提高解释型语言的灵活性和跨平台可用性。
通俗来说,就是Pypy
承担了一部分编译器
的作用,提前将Python
代码翻译成机器语言
,从而提高运行速度
我该如何使用 Pypy 呢?
热烈庆祝,「稳健 Online Judge」已经支持 Pypy
啦!你可以在「稳健 Online Judge」上进行体验!
最新评论