1. 介绍

PyPy 是更快版本的python

  • 使用的package是完全一样的,使用方法完全一样。
  • 但是并不是所有的python里的包,它都支持。
  • 有针对 Python3.7, Python2.7 的版本。
    • 安装PyPy3.7后,就使用 pypy3 命令
    • 安装PyPy2.7后,就使用 pypy2 命令
  • 性能

2. Windows下PyPy安装配置

  • 第一步,创建虚拟环境conda create -n pypy_env
  • 第二步,激活虚拟环境activate pypy_env。可以看到虚拟环境目录(C:\Users\用户名\.conda\envs\pypy_env)下只有了Scriptsconda-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 (略慢)
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐