前言
众所周知,python的一个大缺陷就是运行速度缓慢,尤其是在处理for循环的时候,要么需要使用列表推导,消耗内存来换取速度,要么就使用jit来提速,现在,我们可以使用pypy这个新的python程序来运行我们的python脚本来提速。
官方只提供了针对ubuntu和redhat的二进制版本,这对centos来说就要用源码编译安装,而对于没有root权限的用户来说,简直就是噩梦。
方法
先下载安装miniconda3
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh -O Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh -b -p ~/anaconda_ete/
创建python3虚拟空间
conda create -n pypy3 python==3.6
source activate pypy3
去anaconda 官方查看最新的pypy版本
为conda 添加清华大学源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
#conda-forge
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
#bioconda
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
安装pypy3.6
conda install pypy3.6
安装pypy版本的pip
pypy3 -m ensurepip
安装第三方模块
#方法和python3一样
pypy3 -m pip install numpy
#pandas 不用试了,安装会报错
pypy3 -m pip install pandas
测试下速度的差距
主要是通过 蒙特卡罗法来计算圆周率
先搞一个perl脚本
#pi.pl
$time1 = time();
foreach (1..20000000) {
my($x, $y) = (rand(), rand());
if(sqrt($x ** 2 + $y ** 2) < 1) {
$total += 1;
}
}
$pi = 4.0 * $total / 20000000;
$time2 = time();
print "Pi = " , $pi, " time = ", $time2 - $time1;
再搞一个python脚本
#pi.py
import random
import datetime
import math
starttime = datetime.datetime.now()
total = 0
for i in xrange(20000000):
x, y = random.random(), random.random()
if math.sqrt(x ** 2 + y ** 2) < 1:
total += 1
pi = 4.0 * total / 20000000
endtime = datetime.datetime.now()
print("pi = ", pi , " time = ", (endtime - starttime).seconds)
再搞一个C脚本
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int main() {
time_t start_time, end_time;
double elapsed_time;
double x, y, pi;
long i , total;
total = 0;
srand((unsigned)time(0));
time(&start_time);
for(i = 0 ; i < 20000000; i ++ ) {
x = rand() / (double)(RAND_MAX);
y = rand() / (double)(RAND_MAX);
if (sqrt(x * x + y * y) < 1) {
total += 1;
}
}
pi = 4.0 * total / 20000000;
time(&end_time);
elapsed_time = difftime(end_time, start_time);
printf(" total = %d, pi = %f, time = %f", total ,pi, elapsed_time);
}
分别测试运行时间,我的结果是pypy最快。
网友评论