如何在没有root 权限的集群/服务器上安装pypy

前言

众所周知,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 
#include 
#include  
#include 

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最快。

你可能感兴趣的:(如何在没有root 权限的集群/服务器上安装pypy)