numba初體驗


numba初體驗

今天在知乎上發現了一個很神奇的包numba,可以用jit的方式大幅提高計算型python代碼的效率,一起來看一下


### 安裝

numba的安裝方式很簡單,使用pip或者anacoda都可以

pip3 install numba

注意:numba僅支持python3.5以上的版本


使用

numba的使用也很簡單,使用numba.jit裝飾鋰電函數就可以了

以下是一個簡單的demo

import time
import numba
from functools import wraps


def timeit(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        enter_time = time.time()
        ret = f(*args, **kwargs)
        print("{}:{}".format(f.__name__, time.time()-enter_time))
        return ret
    return wrapper


@timeit
def fib(n):
    f1 = f2 = 1
    for i in range(1, n):
        f1, f2 = f2, f1 + f2
    return f2


@timeit
@numba.jit
def fib_with_jit(n):
    f1 = f2 = 1
    for i in range(1, n):
        f1, f2 = f2, f1 + f2
    return f2


if __name__ == '__main__':
    fib_with_jit(2000000)	# fib_with_jit:0.11314105987548828
    fib(2000000)	# fib:50.43636465072632

可以看到,使用numba裝飾的函數快了大概上百倍。測試過程中還發現,當n比較小時,fib執行的時間比fib_with_jit短很多,但當n逐漸增大時,fib執行時間緩慢增長,而fib_with_jit幾乎不變


### 為什么這么快?

根據官方文檔:numba會讀取python字節碼,結合函數的參數信息,分析和優化代碼,然后使用LLVM編譯器生成與機器匹配的機器碼,之后每次調用函數時直接使用機器碼就行了(其實就是JIT技術,與PyPy類似)

官方文檔地址:http://numba.pydata.org/numba-doc/latest/user/5minguide.html


免責聲明!

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



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