如何讓python的執行速度得到提升
python一直被病垢執行速度太慢,但是實際上python的執行效率並不慢,慢的是python用的直譯器Cpython執行效率太差。
“一行程式碼讓python的執行速度提高100倍”這絕不是譁眾取寵的論調。
我們來看一下這個最簡單的例子,從1一直累加到1億。
最原始的程式碼:
importtime deffoo(x,y): tt=time.time() s=0 foriinrange(x,y): s+=i print('Timeused:{}sec'.format(time.time()-tt)) returns print(foo(1,100000000))
結果
Timeused:6.779874801635742sec 4999999950000000
是不是快了100多倍呢?
那麼下面就分享一下“為啥numba庫的jit模組那麼牛掰?”
NumPy的創始人Travis Oliphant在離開Enthought之後,建立了CONTINUUM,致力於將Python大資料處理方面的應用。最近推出的Numba專案能夠將處理NumPy陣列的Python函式JIT編譯為機器碼執行,從而上百倍的提高程式的運算速度。
Numba專案的主頁上有Linux下的詳細安裝步驟。編譯LLVM需要花一些時間。
Windows使用者可以從Unofficial Windows Binaries for Python Extension Packages下載安裝LLVMPy、meta和numba等幾個擴充套件庫。
下面我們看一個例子:
importnumbaasnb fromnumbaimportjit @jit('f8(f8[:])') defsum1d(array): s=0.0 n=array.shape[0] foriinrange(n): s+=array[i] returns importnumpyasnp array=np.random.random(10000) %timeitsum1d(array) %timeitnp.sum(array) %timeitsum(array) 10000loops,bestof3:38.9usperloop 10000loops,bestof3:32.3usperloop 100loops,bestof3:12.4msperloop
numba中提供了一些修飾器,它們可以將其修飾的函式JIT編譯成機器碼函式,並返回一個可在Python中呼叫機器碼的包裝物件。為了能將Python函式編譯成能高速執行的機器碼,我們需要告訴JIT編譯器函式的各個引數和返回值的型別。我們可以通過多種方式指定型別資訊,在上面的例子中,型別資訊由一個字串'f8(f8[:])'指定。其中'f8'表示8個位元組雙精度浮點數,括號前面的'f8'表示返回值型別,括號裡的表示引數型別,'[:]'表示一維陣列。因此整個型別字串表示sum1d()是一個引數為雙精度浮點數的一維陣列,返回值是一個雙精度浮點數。
內容擴充套件:
Python執行速度提升
相比較C,C++,python一直被抱怨執行速度很慢,實際上python的執行效率並不慢,而是直譯器Cpython執行效率很差。
通過使用numba庫的jit可以讓python的執行速度提高百倍以上。
同諾簡單累加,相乘的例子,可以看出。
#!/usr/bin/env python # encoding: utf-8 ''' @author: Victor @Company:華中科技大學電氣學院聚變與等離子研究所 @version: V1.0 @contact: [email protected] 2018--2020 @software: PyCharm2018 @file: quickPython3.py @time: 2018/9/21 20:54 @desc:使用numba的jit是python程式碼執行速度提高100倍左右 ''' '''平常執行''' import time def add(x,y): tt = time.time() s = 0 for i in range(x,y): s += i print('The time used: {} seconds'.format(time.time()-tt)) return s add(1,100000000) ##########結果############### # D:\Python3\python.exe D:/Pycharm2018Works/InsteringPython3/SomeBasics/quickPython3.py # The time used: 6.712835788726807 seconds # Process finished with exit code 0
'''呼叫numba執行''' import time from numba import jit @jit def add(x,100000000) ##########結果############### # D:\Python3\python.exe D:/Pycharm2018Works/InsteringPython3/SomeBasics/quickPython3.py # The time used: 0.06396007537841797 seconds # # Process finished with exit code 0
Numba模組能夠將處理NumPy陣列的Python函式JIT編譯為機器碼執行,從而上百倍的提高程式的運算速度。