使用numba加速python程序


  前面說過使用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.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程序確實是方便簡單

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM