使用PyPy来运行Python程序?

17

我听说可以使用PyPy运行Python程序,它使用JIT编译器而不是解释器来编译,因此速度快得多。

以下程序可以找到数字600851475143的最大质因数:

import numpy as np

nr = 600851475143
n = 2

while n <= np.sqrt(nr):
    if nr%n == 0:
        nr = nr/n
    n += 1
print(nr)

如何使用PyPy运行这个程序?

我知道他们的网站上有相关文档,但是我不理解,希望能得到演示。


1
它不是用C编译的。实际上与C毫无关系。它在JIT下运行。 - simonzack
请注意,在 PyPy 下使用 math.sqrt 可以立即实现 10 倍的加速。 - Veedrac
1
@JackTaylor 是的。np.sqrt 对于 JIT 来说太复杂了,无法正确地进行内联。 - Veedrac
2
此外,JIT 似乎没有足够的时间来热身,所以它实际上比 CPython 更慢。还有一个事实是,您的算法特别不够优化;如果处理2的幂并仅迭代奇数 n,则速度将快两倍。 - Veedrac
2
不,PyPy更快。你只需要让它运行足够长的时间。对于20000次迭代,PyPy优化后的代码只需约0.8秒。而CPython(版本2)则需要4.6秒。相比之下,Rust(-O)和C++(-O3)都只需要约0.4秒,因此PyPy甚至没有花费两倍的时间! - Veedrac
显示剩余4条评论
3个回答

19

在程序顶部添加这个 shebang 行:

#!/usr/bin/env pypy

如果您想手动执行此操作,请在命令行中输入pypy main.py


谢谢。因此,程序本身不需要更改,您只需使用另一个程序来运行文件。您知道 PyPy(JIT 编译器)的速度如何与编译语言(如 C 和 FORTRAN)相比吗? - Jonny
他们有一个实时速度基准,这取决于代码,但粗略估计会慢2-10倍。 - simonzack
很好。另外,当我尝试使用“pypy test.py”从终端运行程序时,它会给我一个错误,但是当我在程序顶部添加了你建议的那一行并运行“python test.py”时,它可以工作。这正常吗?还是PyPy安装出了问题? - Jonny
@JackTaylor 这不正常,不是的。这意味着你的 PyPy 安装有问题。请注意 #! 是为了让你可以执行 chmod +x test.py; ./test.py;运行 python test.py 不会使用 PyPy。 - Veedrac
我遇到了“没有名为numpy的模块”的错误,所以我猜测pypy没有看到numpy的安装。不过,当我在程序顶部添加答案中提到的行并正常运行时,就不会出现任何错误? - Jonny
1
@JackTaylor PyPy有一个单独的软件包安装集合;显然你没有Numpy。顺便说一下,PyPy中的Numpy支持有些实验性,你需要单独安装它。 - Veedrac

0

对于Linux:

  • pypy.org下载最新版本的PyPy
  • 将zip文档解压到您希望的位置

对于交互式会话

$ ./pypy-x.y.z/bin/pypy

Python 2.7.x (xxxxxxxxxxxx, Date, Time)
[PyPy x.y.z with GCC x.y.z] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``PyPy is an exciting technology
that lets you to write fast, portable, multi-platform interpreters with less
effort

>>>>

如果您想在整个系统中使PyPy可用,可以将pypy可执行文件的symlink放置在/usr/local/bin中。重要的是要放置一个symlink而不是移动二进制文件,否则PyPy将无法找到其库。

0

保持您的环境处于激活状态,进入pypyXXXX文件夹。然后进入bin目录并运行以下命令。

pip install <packagename>

然后使用pypy运行您的文件。
pypy filename.py

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接