前面说过使用Cython来加速python程序的运行速度,但是相对来说程序改动较大,这次就说一种简单的方式来加速python计算速度的方法,就是使用numba库来进行,numba库可以使用JIT技术即时编译,达到高性能,另外也可以使用cuda GPU的计算能力来加速,对python来说是一个提速非常好的工具库,使用简单,但是安装稍微复杂一些,具体过程如下:

  安装numba需要的依赖如下:

  Python依赖有(按顺序):

  setuptools

  enum34     pypi下载地址:https://pypi.python.org/pypi/enum34

  funcsigs 下载地址:https://pypi.python.org/pypi/funcsigs/

  singledispatch 下载地址:https://pypi.python.org/pypi/singledispatch/

  llvmlite https://pypi.python.org/pypi/llvmlite/  这个下载的是最新版的0.16.0

  上面这些python依赖的安装很简单,都是解压完然后执行python setup.py install即可

  其中安装llvmlite的时候需要最艰难的一步,llvmlite需要llvm环境的支持,并且0.16.0的版本必须依赖于3.9.x的环境,llvm官网下载地址是:http://releases.llvm.org/download.html 最新的版本是4.0.0,记住要下载3.9.1的,如果安装了4.0.0那么安装llvmlite的时候会提示llvm版本问题,下载好的包如下:

  llvm-3.9.1.src.tar.xz

  cfe-3.9.1.src.tar.xz

  clang-tools-extra-3.9.1.src.tar.xz

  compiler-rt-3.9.1.src.tar.xz

  依次执行如下命令解压并操作:

xz -d llvm-3.9..src.tar.xz
xz -d cfe-3.9..src.tar.xz
xz -d clang-tools-extra-3.9..src.tar.xz
xz -d compiler-rt-3.9..src.tar.xz
tar -xvf llvm-3.9..src.tar
tar -xvf cfe-3.9..src.tar
tar -xvf clang-tools-extra-3.9..src.tar
tar -xvf compiler-rt-3.9..src.tar
mv cfe-3.9..src clang
mv clang llvm-3.9..src/tools/
mv clang-tools-extra-3.9..src extra
mv extra/ llvm-3.9..src/tools/clang/
mv compiler-rt-3.9..src compiler-rt
mv compiler-rt llvm-3.9..src/projects/

  放好之后开始编译源代码,编译需要使用cmake 如果没有安装需要安装,下面开始编译,编译过程非常长,64G服务器还得半个小时左右,并且编译出来的文件有20多G大小,硬盘也要留够,为防止编译过程中断,尽量使用screen会话执行:

mkdir build-3.9
cmake -G "Unix Makefiles" ../llvm-3.9..src
make -j4
make install

  完了之后可以删除原来的代码目录

  然后如果接下来再安装llvmlite的话,如果报cannot find -lstdc++的错误的话那么是缺少下面的包,可以使用yum安装:

yum -y install glibc-static
yum -y install libstdc++-devel
yum -y install libstdc++-static

  必须注意第三个一定要安装,如果不安装的话那么一直会报上面的错误,也可以下载libstdc++-static包进行离线安装,下载地址是:https://pkgs.org/download/libstdc++-static 下载之后使用rpm安装成功之后,再次安装llvmlite就成功了

  然后开始安装numba,numba下载地址是:http://numba.pydata.org/download.html 这里我们下载最新版的0.31.0,下载之后和安装普通依赖一样执行setup.py就可以了,最后安装完成numba就可以使用了,下面写一个小案例来看一下加速后的程序和加速前的程序的区别,借用官网上最经典的例子:

#!/usr/bin/env python
# coding=utf-8
from numba import jit
from numpy import arange
import time @jit
def sum2d(arr):
M, N = arr.shape
result = 0.0
for i in range(M):
for j in range(N):
result += arr[i,j]
return result a = arange(9).reshape(3,3)
start_time = time.time()
for i in range(10000000):
sum2d(a)
end_time = time.time()
print (end_time - start_time)

  这里使用numpy生成三行三列的矩阵,[[0,1,2],[3,4,5],[6,7,8]]然后做二维累加计算,值显然应该是36,这里做了10000000次这样的计算,使用@jit注解可以直接的使用numba jit技术实时编译,从而提高速度,最终运行时间大约是3.86s,如果去掉注解的话那么运行时间大约是25.45s从这里可以看出来大约有6.6倍的性能提升,所以使用numba加速python程序确实是方便简单

使用numba加速python程序的更多相关文章

  1. Numba加速Python程序

    众所周知,Python和Java一样是基于虚拟机的语言,并不是像C/C++那样将程序代码编译成机器语言再运行,而是解释一行执行一行,速度比较慢.使用Numba库的JIT技术编译以后,可以明显提高程序的 ...

  2. 用Cython加速Python程序以及包装C程序简单测试

    用Cython加速Python程序 我没有拼错,就是Cython,C+Python=Cython! 我们来看看Cython的威力,先运行下边的程序: import time def fib(n): i ...

  3. 用 Numba 加速 Python 代码

    原文出自微信公众号:Python那些事 一.介绍 pip install numba Numba 是 python 的即时(Just-in-time)编译器,即当你调用 python 函数时,你的全部 ...

  4. numba jit加速python程序

    numba numba加速循环.numpy的一些运算,大概是将python和numpy的一些代码转化为机器代码,速度飞快! 加速耗时很长的循环时: from numba import jit # 在函 ...

  5. 使用numba加速python科学计算

    技术背景 python作为一门编程语言,有非常大的生态优势,但是其执行效率一直被人诟病.纯粹的python代码跑起来速度会非常的缓慢,因此很多对性能要求比较高的python库,需要用C++或者Fort ...

  6. python程序的pypy加速

    我们知道,python作为一种几乎是脚本语言的语言,其优点固然有,但是其有一个最大的缺点,就是运行速度没有办法和c,c++,java比.最近在些一些代码的时候也是碰到了这样的问题. 具体而言,pyth ...

  7. 贡献python prim多源最短路搜索算法 numba加速方法的demo和总结

    1.测试两个算法 #coding:utf-8 import time import numba import numpy as np ''' 使用numba加速总结, (1).在数值计算比如int f ...

  8. 5款Python程序员高频使用开发工具推荐

    很多Python学习者想必都会有如下感悟:最开始学习Python的时候,因为没有去探索好用的工具,吃了很多苦头.后来工作中深刻体会到,合理使用开发的工具的便利和高效.今天,我就把Python程序员使用 ...

  9. 构建可扩展的GPU加速应用程序(NVIDIA HPC)

    构建可扩展的GPU加速应用程序(NVIDIA HPC) 研究人员.科学家和开发人员正在通过加速NVIDIA GPU上的高性能计算(HPC)应用来推进科学发展,NVIDIA GPU具有处理当今最具挑战性 ...

随机推荐

  1. luoguP4705 玩游戏 分治FFT

    \[ \begin{aligned} Ans(k) &= \sum \limits_{i = 1}^n \sum \limits_{j = 1}^m \sum \limits_{t = 0}^ ...

  2. BZOJ4276 : [ONTAK2015]Bajtman i Okrągły Robin

    建立线段树, S向每个叶子连边,容量1,费用0. 孩子向父亲连边,容量inf,费用0. 每个强盗向T连边,容量1,费用为c[i]. 对应区间内的点向每个强盗,容量1,费用0. 求最大费用流即可. #i ...

  3. [Java]struts2-spring整合时配置监听器

    1.struts2-spring整合时配置监听器 [在web.xml中] <!-- 上下文载入器监听器,确保web服务器启动时,直接完成spring容器的初始化 --/> [Ctrl + ...

  4. 利用最新的CentOS7.5,hadoop3.1,spark2.3.2搭建spark集群

    1. 桥接模式,静态ip上外网:vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=EthernetPROXY_METHOD=noneBROWSER_ ...

  5. Delphi 资源管理器套件

    需要个类似资源管理器的东西, 首先试了下 TDriveComboBox.TDirectoryListBox.TFileListBox, 嘿! Win31 时代的东西, 不是一般地丑. 试了下 Vcl. ...

  6. spring data jpa在使用PostgreSQL表名大小写的问题解决

    国内的文章看了一遍,其实没找到根本问题解决方法,下面将列举这一系列的问题解决方法: 1.在配置文件增加如下配置: spring.jpa.hibernate.naming.physical-strate ...

  7. dubbox REST服务使用fastjson替换jackson

    上一节讲解了resteasy如何使用fastjson来替换默认的jackson,虽然dubbox内部采用的就是resteasy,但是大多数情况下,dubbox服务是一个独立的app,并不需要以war包 ...

  8. Jedis使用总结【pipeline】【分布式的id生成器】【分布式锁【watch】【multi】】【redis分布式】(转)

    前段时间细节的了解了Jedis的使用,Jedis是redis的java版本的客户端实现.本文做个总结,主要分享如下内容: [pipeline][分布式的id生成器][分布式锁[watch][multi ...

  9. STM32 microcontroller system memory boot mode

    The bootloader is stored in the internal boot ROM memory (system memory) of STM32 devices. It is pro ...

  10. the difference between an embOS interrupt and a zero latency interrupt

    the difference between an embOS interrupt and a zero latency interrupt is the interrupt priority lev ...