1. 介绍
PyPy 是更快版本的python
- 使用的package是完全一样的,使用方法完全一样。
- 但是并不是所有的python里的包,它都支持。
- 有针对 Python3.7, Python2.7 的版本。
- 安装
PyPy3.7
后,就使用 pypy3 命令 - 安装
PyPy2.7
后,就使用 pypy2 命令
- 安装
- 性能
- 根据pypy入门:pypy的安装及使用介绍, PyPy比Python快17倍
- 然而也不一定更快。我用pypy3.7和python3.8跑,我写的光镊程序,发现前者耗时0.436s,后者耗时0.283s
2. Windows下PyPy安装配置
- 第一步,创建虚拟环境
conda create -n pypy_env
- 第二步,激活虚拟环境
activate pypy_env
。可以看到虚拟环境目录(C:\Users\用户名\.conda\envs\pypy_env
)下只有了Scripts
和conda-meta
文件夹,内容也只有conda - 第三步,解压安装。Pypy 官网下载,下载下来后,解压出来,将内容复制到该虚拟环境目录即可。如果不需要虚拟环境,前两步都不需要。只需要将PyPy的文件夹添加到Path环境变量即可
- windows下,还要保证安装了
VC runtime library
. PyPy的官方下载页面,有提供它的安装链接
然后安装pip工具.pypy3 -m ensurepip
之后安装包,就可以直接使用命令pypy3 -m pip install 包名
。
- 如
pypy3 -m pip install numpy
参考:
3. 特殊的包
- numpy,imageio: 没啥问题
- matplotlib: 不指定版本时,总是安装失败。当安装2.2,3.3.1版本时,就成功了。
pypy3 -m pip install matplotlib==3.3.1
- pandas: 不指定版本时,总是安装失败。当安装1.2.0版本时,就成功了。
pypy3 -m pip install matplotlib==1.2.0
- scipy: 直接安装会失败。安装很慢,因为它要编译scipy包,而scipy挺大的
4. 测试
根据下面的两个测试,说明了
- 执行循环时,PyPy 比 Python快数十倍
- 在其他库的使用中,速度不一定更快。甚至更慢。如numpy
- numpy 是C++写的。所以它的执行已经很快了,用pypy转一下,并不会变快。同理可知,scipy,pandas应该也是这个测试结果
4.1. 测试循环
import time
t = time.time()
for i in range(10**8):
continue
print(time.time() - t)
测试结果,耗时:
- python3.8: 2.956s
- pypy3: 0.060s (快了33倍了)
4.2. numpy测试
import numpy as np
import time
t = time.time()
# row is y, column is x
row_count = 4024
col_count = row_count
center_x = col_count//2 - 0.5
center_y = row_count//2 - 0.5
x0 = np.arange(col_count)
y0 = np.arange(row_count)
x0 = x0 - center_x # 向右为正
y0 = center_y - y0 # 向上为正
x_grid, y_grid = np.meshgrid(x0, y0)
half_size = row_count / 2
x = x_grid.flatten() / half_size # 转换为 [-1,1]之间的值,单位圆嘛
y = y_grid.flatten() / half_size
x2 = x ** 2
y2 = y ** 2
x3 = x ** 3
y3 = y ** 3
x4 = x ** 4
y4 = y ** 4
xy = x * y
Z = np.zeros([15, len(x)])
# Z0
# Fun1 = lambda x, y: 1
Z[0, :] = np.ones_like(x)
# Z1
# Fun1 = lambda x, y: y
Z[1, :] = y
# Z2
# Fun2 = lambda x, y: x
Z[2, :] = x
# Z3
# Fun3 = lambda x, y: 2*x*y
Z[3, :] = 2 * xy
# Z4
# Fun4 = lambda x, y: -1 + 2 * (x ** 2 + y ** 2)
Z[4, :] = -1 + 2 * (x2 + y2)
# Z5
# Fun5 = lambda x, y: x**2 - y**2
Z[5, :] = x2 - y2
# Z6
# Fun6 = lambda x, y: 3 * x**2 * y - y**3
Z[6, :] = 3 * x2 * y - y3
# Z7
# Fun7 = lambda x, y: -2*y + 3*y * (x**2 + y**2) # 与效果图有点对不上
Z[7, :] = -2 * y + 3 * y * (x2 + y2)
# Z8
# Fun8 = lambda x, y: -2*x + 3*x * (x**2 + y**2) # 与效果图有点对不上
Z[8, :] = -2 * x + 3 * x * (x2 + y2)
# Z9
# Fun9 = lambda x, y: x**3 - 3*x*y**2
Z[9, :] = x3 - 3 * x * y2
# Z10
# Fun10 = lambda x, y: 4 * x**3 * y - 4 * x * y**3
Z[10, :] = 4 * x3 * y - 4 * x * y3
# Z11
# Fun11 = lambda x, y: -6*x*y + 8*x*y * (x**2 + y**2) # 与效果图有点对不上
Z[11, :] = -6 * xy + 8 * xy * (x2 + y2)
# Z12
# Fun12 = lambda x, y: 1 - 6*(x**2 + y**2) + 6*(x**2 + y**2)**2 # 与效果图有点对不上
Z[12, :] = 1 - 6 * (x2 + y2) + 6 * (x2 + y2)**2
# Z13
# Fun13 = lambda x, y: -3*x**2 + 3*y**2 + 4*x**4 - 4*y**4 # 与效果图有点对不上.我推出来,它的公式是对的,只是少了前面的系数根号10
Z[13, :] = -3 * x2 + 3*y2 + 4 * x4 - 4 * y4
# Z14
# Fun14 = lambda x, y: x**4 - 6 * x**2 * y**2 + y**4
Z[14, :] = x4 - 6 * x2 * y2 + y4
print(time.time() - t)
测试结果,耗时:
- python3.8: 6.092s
- pypy3: 6.195s (略慢)