pypy是一个支持JIT技术的python解释器实现,在某些任务上可以期待比cpython更好的性能。但是由于很多python包使用了特殊的cpython扩展接口,很难得到cpython的支持。特别是流行的机器学习和科学计算的软件包,通常都是直接通过anaconda预编译的,这就很难支持pypy。一直疑惑pypy在科学计算任务上是否比cpython有优势,在macOS上装了一晚上搞定了pypy3+numpy+scipy+matplotlib+scikit-learn+matplotlib,记录在这里。首先你需要安装pypy3本身和编译器。它可以通过自制软件安装:brewinstallpypy3gccg++gfortran此时pypy3和pip已经可用。可以使用pypy3命令代替python3命令来运行一些脚本:pip_pypy3installpackage_namepypy3#startpypy3注意如果当前有condaenv,virtualenv是激活的,先去激活。有时候pypy3没有正确设置环境变量,会有一些warnings,但是我测试的时候只有warnings,没有error。另外pypy3默认安装的包比较少,可能会出现各种ImportError,一般可以通过pip_pypy3安装相应的包来解决。“纯python软件包”一般都能安装成功。只有像numpy这样的C扩展的包和其他需要链接的库安装起来比较麻烦。为了安装numpy,首先需要安装某个数学加速库。这里推荐安装OpenBLAS。好像不能直接安装预编译的OpenBLAS,可能是预编译的编译器版本和本地不一致。所以直接从github上拉取最新版本编译安装:gitclonehttps://github.com/xianyi/OpenBLAS.gitcdOpenBLASMake#defaultinstallinto/opt/OpenBLASsudomakeinstall注意anaconda中的numpy链接是intelmkl.您可以尝试从intel官网搜索并安装该软件包。当以root身份安装时,此软件包将安装在opt/intel/mkl中。我没有试过链接intelmkl,不知道能不能成功。然后编译安装numpy&scipy。从pip安装这两个包会失败,所以源码还是从github上拉取的。这里以numpy为例,scipy是同一个组织的软件包,安装步骤完全一样。#installwheelatfirstpip_pypy3installwheelgitclonehttps://github.com/numpy/numpy.git从pip安装失败是因为链接无法到达OpenBLAS。从博客上了解到需要在numpy源码site.cfg的根目录下添加一个文件,指定OpenBLAS位置:[DEFAULT]library_dirs=/opt/OpenBLAS/libinclude_dirs=/opt/OpenBLAS/include[atlas]atlas_libs=openblaslibraries=openblas[openblas]libraries=openblaslibrary_dirs=/opt/OpenBLAS/libinclude_dirs=/opt/OpenBLAS/includescipy编译时也需要在其根目录下创建一个相同的文件,直接复制numpy目录下的文件即可。然后编译安装。cdnumpy#或scipypypy3setup.pybuildpypy3setup.pyinstall这些编译可能需要几分钟时间。numpy&scipy安装成功后,其他常用软件包如matplotlib、jupyter、scikit-learn等可以直接通过pip_pypy3安装。之后如果要启动ipython,由于环境变量可能不正确,可能需要使用以下命令:pypy3-mIPython至此,基于pypy3的科学计算&机器学习环境已经安装成功~pypy3在某些场景下比cpython快,但是在我的项目中,它不仅没有变快,反而变慢了。.对于运行时间短的类似脚本的科学计算项目,pypy3的优势可能不明显,也可能是我的开启方式有问题。.
