1. 程式人生 > 程式設計 >如何讓python的執行速度得到提升

如何讓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編譯為機器碼執行,從而上百倍的提高程式的運算速度。