Python中Numba庫裝飾器的具體使用
一、運行速度是Python天生的短板
1.1 編譯型語言:C++
對于編譯型語言,開發(fā)完成以后需要將所有的源代碼都轉(zhuǎn)換成可執(zhí)行程序,比如 Windows 下的.exe文件,可執(zhí)行程序里面包含的就是機器碼。只要我們擁有可執(zhí)行程序,就可以隨時運行,不用再重新編譯了,也就是“一次編譯,無限次運行”。
在運行的時候,我們只需要編譯生成的可執(zhí)行程序,不再需要源代碼和編譯器了,所以說編譯型語言可以脫離開發(fā)環(huán)境運行。
編譯型語言一般是不能跨平臺的,也就是不能在不同的操作系統(tǒng)之間隨意切換。
1.2 解釋型語言:Python
對于解釋型語言,每次執(zhí)行程序都需要一邊轉(zhuǎn)換一邊執(zhí)行,用到哪些源代碼就將哪些源代碼轉(zhuǎn)換成機器碼,用不到的不進行任何處理。每次執(zhí)行程序時可能使用不同的功能,這個時候需要轉(zhuǎn)換的源代碼也不一樣。
因為每次執(zhí)行程序都需要重新轉(zhuǎn)換源代碼,所以解釋型語言的執(zhí)行效率天生就低于編譯型語言,甚至存在數(shù)量級的差距。計算機的一些底層功能,或者關(guān)鍵算法,一般都使用 C/C++ 實現(xiàn),只有在應用層面(比如網(wǎng)站開發(fā)、批處理、小工具等)才會使用解釋型語言。
在運行解釋型語言的時候,我們始終都需要源代碼和解釋器,所以說它無法脫離開發(fā)環(huán)境。
1.3 速度對比:C++比Python快25倍
我不會C++語言、也沒有C++語言的運行的環(huán)境,借用網(wǎng)友的對比結(jié)果:
編譯后,運行C++代碼,生成全部13-mers共6700萬個大約需要2.42秒。這意味著運行相同算法,Python用時是C++的25倍多。
二、Numba使用與否的對比,計算1000萬以內(nèi)的素數(shù)
2.1 原生Python,計算1000萬以內(nèi)的素數(shù)
def U27_1000W以內(nèi)的素數(shù)(): import math import time def is_prime(num): if num == 2: return True if num <= 1 or num % 2 == 0: return False for div in range(3, int(math.sqrt(num) + 1), 2): if num % div == 0: return False return True def run_program(N): total = 0 for i in range(N): if is_prime(i): total += 1 return total # if __name__ == "__main__": N = 10000000 start = time.time() total = run_program(N) end = time.time() print(f"1000萬以內(nèi)所有的素數(shù)有 {total} 個") print(f"純Python耗時: {end - start} 秒\b") return end - start
2.2 Numba裝飾器,計算1000萬以內(nèi)的素數(shù)
def U28_1000W以內(nèi)的素數(shù)_Numba裝飾器(): import math import time from numba import njit, prange # @njit 相當于 @jit(nopython=True) @njit def is_prime(num): if num == 2: # 2為素數(shù) return True if num <= 1 or num % 2 == 0: # 偶數(shù)中除了2都不是素數(shù) return False for div in range(3, int(math.sqrt(num) + 1), 2): if num % div == 0: return False return True #使用Numba的prange來進行并發(fā)循環(huán)計算 @njit(parallel = True) def run_program(N): total = 0 #使用Numba提供的prange參數(shù)來進行并行計算 for i in prange(N): if is_prime(i): total += 1 return total # if __name__ == "__main__": N = 10000000 start = time.time() total = run_program(N) end = time.time() print(f"1000萬以內(nèi)所有的素數(shù)有 {total} 個") print(f"Numba裝飾器耗時: {end - start} 秒\b") return end - start
2.3 實測速度:使用numba裝飾器,速度提升 22.0 倍,逼近C++
t0 = U27_1000W以內(nèi)的素數(shù)() t1 = U28_1000W以內(nèi)的素數(shù)_Numba裝飾器() print(f'使用numba裝飾器,速度提升 {round(t0/t1, 0)} 倍') 1000萬以內(nèi)所有的素數(shù)有 664579 個 純Python耗時: 86.78110885620117 秒 1000萬以內(nèi)所有的素數(shù)有 664579 個 Numba裝飾器耗時: 3.9410934448242188 秒 使用numba裝飾器,速度提升 22.0 倍
三、素數(shù)算法
質(zhì)數(shù)也就是大于1的整數(shù)中,除了1和它本身以外不能被其他整數(shù)整除的數(shù),也叫素數(shù)。
# 算法一:針對輸入的數(shù)字x,我們可以遍歷從2到x-1這個區(qū)間中的數(shù),如果x能被這個區(qū)間中任意一個數(shù)整除,那么它就不是質(zhì)數(shù)。 def is_prime1(x): for i in range(2, x): if x % i == 0: return False return True # 算法二:對算法一的優(yōu)化,事實上只需要遍歷從2到√x即可。 def is_prime2(x): for i in range(2, int(x ** 0.5) + 1): if x % i == 0: return False return True # 算法三:偶數(shù)中除了2都不是質(zhì)數(shù),且奇數(shù)的因數(shù)也沒有偶數(shù),因此可以進一步優(yōu)化。 def is_prime3(x): if x == 2: return True elif x % 2 == 0: return False for i in range(3, int(x ** 0.5) + 1, 2): if x % i == 0: return False return True # 算法四:任何一個自然數(shù),總可以表示成以下六種形式之一:6n,6n+1,6n+2,6n+3,6n+4,6n+5(n=0,1,2...)我們可以發(fā)現(xiàn),除了2和3,只有形如6n+1和6n+5的數(shù)有可能是質(zhì)數(shù)。且形如6n+1和6n+5的數(shù)如果不是質(zhì)數(shù),它們的因數(shù)也會含有形如6n+1或者6n+5的數(shù),因此可以得到如下算法: def is_prime4(x): if (x == 2) or (x == 3): return True if (x % 6 != 1) and (x % 6 != 5): return False for i in range(5, int(x ** 0.5) + 1, 6): if (x % i == 0) or (x % (i + 2) == 0): return False return True
四、Numba
4.1 官方文檔
numba 是一款可以將 python 函數(shù)編譯為機器代碼的JIT編譯器,經(jīng)過 numba 編譯的python 代碼(僅限數(shù)組運算),其運行速度可以接近 C 或 FORTRAN 語言。
官方文檔鏈接:http://numba.pydata.org/numba-doc/latest/index.html
到此這篇關(guān)于Python中Numba庫裝飾器的具體使用的文章就介紹到這了,更多相關(guān)Python Numba庫裝飾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3二分查找?guī)旌瘮?shù)bisect(),bisect_left()和bisect_right()的區(qū)別
這篇文章主要介紹了Python3二分查找?guī)旌瘮?shù)bisect(),bisect_left()和bisect_right()的區(qū)別,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03Python 多模式字符串搜索 Aho-Corasick詳解
Aho-Corasick 算法是一種用于精確或近似多模式字符串搜索的高效算法,本文給大家介紹Python 多模式字符串搜索 Aho-Corasick的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧2025-01-01關(guān)于python通過新建環(huán)境安裝tfx的問題
這篇文章主要介紹了python安裝tfx/新建環(huán)境,新建一個環(huán)境tfx專門用來運行流水線,這個環(huán)境安裝python3.8,對python安裝tfx相關(guān)知識感興趣的朋友一起看看吧2022-05-05