“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

看到这里,你应该会有疑问?这不是多此一举吗?(套娃?)其实不然,我们先来看这几组数据

我们用同样的代码,分别使用PythonPypy,在 在线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」上进行体验!