一、簡介
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模塊。