前面說過使用Cython來加速python程序的運行速度,可是相對來講程序改動較大,此次就說一種簡單的方式來加速python計算速度的方法,就是使用numba庫來進行,numba庫可使用JIT技術即時編譯,達到高性能,另外也可使用cuda GPU的計算能力來加速,對python來講是一個提速很是好的工具庫,使用簡單,可是安裝稍微複雜一些,具體過程以下:html
安裝numba須要的依賴以下:python
Python依賴有(按順序):c++
setuptools服務器
enum34 pypi下載地址:https://pypi.python.org/pypi/enum34工具
funcsigs 下載地址:https://pypi.python.org/pypi/funcsigs/性能
singledispatch 下載地址:https://pypi.python.org/pypi/singledispatch/ui
llvmlite https://pypi.python.org/pypi/llvmlite/ 這個下載的是最新版的0.16.0spa
上面這些python依賴的安裝很簡單,都是解壓完而後執行python setup.py install便可code
其中安裝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版本問題,下載好的包以下:htm
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.1.src.tar.xz xz -d cfe-3.9.1.src.tar.xz xz -d clang-tools-extra-3.9.1.src.tar.xz xz -d compiler-rt-3.9.1.src.tar.xz tar -xvf llvm-3.9.1.src.tar tar -xvf cfe-3.9.1.src.tar tar -xvf clang-tools-extra-3.9.1.src.tar tar -xvf compiler-rt-3.9.1.src.tar mv cfe-3.9.1.src clang mv clang llvm-3.9.1.src/tools/ mv clang-tools-extra-3.9.1.src extra mv extra/ llvm-3.9.1.src/tools/clang/ mv compiler-rt-3.9.1.src compiler-rt mv compiler-rt llvm-3.9.1.src/projects/
放好以後開始編譯源代碼,編譯須要使用cmake 若是沒有安裝須要安裝,下面開始編譯,編譯過程很是長,64G服務器還得半個小時左右,而且編譯出來的文件有20多G大小,硬盤也要留夠,爲防止編譯過程當中斷,儘可能使用screen會話執行:
mkdir build-3.9 cmake -G "Unix Makefiles" ../llvm-3.9.1.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程序確實是方便簡單