Numba:高性能Python編譯器


一、簡介

Numba是一個開源JIT編譯器,它將Python和NumPy代碼的子集轉換為快速機器代碼。

 

二、主要特點

加速Python功能

Numba使用行業標准的LLVM編譯器庫在運行時將Python函數轉換為優化的機器代碼。 Python中的Numba編譯數值算法可以接近C或FORTRAN的速度。
您不需要替換Python解釋器,運行單獨的編譯步驟,甚至安裝C / C ++編譯器。 只需將其中一個Numba裝飾器應用到Python函數中,Numba就會完成剩下的工作。

 

專為科學計算而打造

Numba旨在與NumPy陣列和功能一起使用。 Numba為不同的陣列數據類型和布局生成專門的代碼,以優化性能。特殊裝飾器可以創建通用功能,可以像NumPy函數那樣在NumPy數組上進行廣播。
Numba還可以與Jupyter筆記本電腦配合使用,實現交互式計算,以及分布式執行框架,如Dask和Spark。

 

並行化您的算法

Numba提供了一系列用於並行化CPU和GPU代碼的選項,通常只需要很少的代碼更改。


便攜式編譯

運送高性能Python應用程序,而不必擔心二進制編譯和打包。您的源代碼仍然是純Python,而Numba在運行時處理編譯。我們在200多種不同的平台配置中持續測試Numba。
Numba支持Intel和AMD x86,POWER8 / 9和ARM CPU,NVIDIA和AMD GPU,Python 2.7和3.4-3.7,以及Windows / macOS / Linux。大多數系統的預編譯Numba二進制文件可用作conda軟件包和pip可安裝的輪子。


三、示例

python一直被病垢運行速度太慢,但是實際上python的執行效率並不慢,慢的是python用的解釋器Cpython運行效率太差。

“一行代碼讓python的運行速度提高100倍”這絕不是嘩眾取寵的論調。

我們來看一下這個最簡單的例子,從1一直累加到1億。

最原始的代碼:

import time
def foo(x,y):
        tt = time.time()
        s = 0
        for i in range(x,y):
                s += i
        print('Time used: {} sec'.format(time.time()-tt))
        return s

print(foo(1,100000000))

結果:

Time used: 6.779874801635742 sec
4999999950000000

我們來加一行代碼,再看看結果:

from numba import jit
import time
@jit
def foo(x,y):
        tt = time.time()
        s = 0
        for i in range(x,y):
                s += i
        print('Time used: {} sec'.format(time.time()-tt))
        return s
print(foo(1,100000000))

結果:

Time used: 0.04680037498474121 sec
4999999950000000

是不是快了100多倍呢?
就因為使用了 numba庫的jit模塊。


免責聲明!

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



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