日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Python可以比C++更快,你不信?

 Python 是一個用途非常廣泛的編程語言,擁有成千上萬的第三方庫,在人工智能、機(jī)器學(xué)習(xí)、自動化等方面有著廣泛的應(yīng)用,眾所周知,Python 是動態(tài)語言,有全局解釋器鎖,比其他靜態(tài)語言要慢,也正是這個原因,你也許會轉(zhuǎn)向其他語言如 Java、C++,不過先等等,今天分享一個可以讓 Python 比 C++ 還要快的技術(shù),看完再決定要不要轉(zhuǎn)吧。

創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、綏德網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、html5、購物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為綏德等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

今天的主角就是 Numba,Numba 是一個開源的即時編譯器(JIT compiler),可將 Python 和 NumPy 的代碼的轉(zhuǎn)換為快速的機(jī)器碼,從而提升運(yùn)行速度??梢赃_(dá)到 C 或 FORTRAN 的速度。

這么牛逼是不是很難用呢?No,No,No,So easy,你不需要替換 Python 解釋器,不需要單獨(dú)編譯,甚至不需要安裝 C / C ++ 編譯器。只需將 Numba 提供的裝飾器放在 Python 函數(shù)上面就行,剩下的就交給 Numba 完成。舉個簡單的例子:

 
 
 
 
  1. from numba import jit 
  2. import random 
  3. @jit(nopython=True) 
  4. def monte_carlo_pi(nsamples): 
  5.     acc = 0 
  6.     for i in range(nsamples): 
  7.         x = random.random() 
  8.         y = random.random() 
  9.         if (x ** 2 + y ** 2) < 1.0: 
  10.             acc += 1 
  11.     return 4.0 * acc / nsamples

Numba 是專為科學(xué)計算而設(shè)計的,在與 NumPy 一起使用時,Numba 會為不同的數(shù)組數(shù)據(jù)類型生成專門的代碼,以優(yōu)化性能:

 
 
 
 
  1. @numba.jit(nopython=True, parallel=True) 
  2. def logistic_regression(Y, X, w, iterations): 
  3.     for i in range(iterations): 
  4.         w -= np.dot(((1.0 / 
  5.               (1.0 + np.exp(-Y * np.dot(X, w))) 
  6.               - 1.0) * Y), X) 
  7.     return w

現(xiàn)在我們來看看,同樣的代碼,使用 Numba 前后與 C++ 的性能對比。比如說我們要找出 1000 萬以內(nèi)所有的素數(shù),代碼的算法邏輯是相同的:

 
 
 
 
  1. Python 代碼: 
  2. import math 
  3. import time 
  4. def is_prime(num): 
  5.     if num == 2: 
  6.         return True 
  7.     if num <= 1 or not num % 2: 
  8.         return False 
  9.     for div in range(3, int(math.sqrt(num) + 1), 2): 
  10.         if not num % div: 
  11.             return False 
  12.     return True 
  13. def run_program(N): 
  14.     total = 0 
  15.     for i in range(N): 
  16.         if is_prime(i): 
  17.             total += 1 
  18.     return total 
  19. if __name__ == "__main__":
  20.      N = 10000000 
  21.     start = time.time() 
  22.     total = run_program(N) 
  23.     end = time.time() 
  24.     print(f"total prime num is {total}") 
  25.     print(f"cost {end - start}s")

執(zhí)行耗時:

 
 
 
 
  1. total prime num is 664579 
  2. cost 47.386465072631836s

C++ 代碼如下:

 
 
 
 
  1. #include  
  2. #include  
  3. #include  
  4. using namespace std; 
  5. bool isPrime(int num) { 
  6.     if (num == 2) return true; 
  7.     if (num <= 1 || num % 2 == 0) return false;
  8.     double sqrtsqrt_num = sqrt(double(num)); 
  9.     for (int div = 3; div <= sqrt_num; div +=2){ 
  10.        if (num % div == 0) return false; 
  11.     } 
  12.      return true; 
  13. int run_program(int N){ 
  14.     int total = 0; 
  15.     for (int i; i < N; i++) { 
  16.         if(isPrime(i)) total ++; 
  17.     } 
  18.     return total; 
  19. int main() 
  20.     int N = 10000000; 
  21.     clock_t start,end; 
  22.     start = clock(); 
  23.     int total = run_program(N); 
  24.     end = clock(); 
  25.     cout << "total prime num is " << total; 
  26.     cout << "\ncost " << (end - start) / ((double) CLOCKS_PER_SEC) << "s\n"; 
  27.     return 0; 
 
 
 
 
  1. $ g++ isPrime.cpp -o isPrime 
  2. $ ./isPrime 
  3. total prime num is 664579 
  4. cost 2.36221s

c++

C++ 確實(shí)牛逼,才 2.3 秒,不過好戲還在后頭,現(xiàn)在我們使用 Numba 來加速一下,操作很簡單,不需要改動原有的代碼,先導(dǎo)入 Numba 的 njit,再在函數(shù)上方放個裝飾器 @njit 即可,其他保持不變,代碼如下:

 
 
 
 
  1. import math 
  2. import time 
  3. from numba import njit 
  4. # @njit 相當(dāng)于 @jit(nopython=True)  
  5. @njit 
  6. def is_prime(num): 
  7.     if num == 2: 
  8.         return True 
  9.     if num <= 1 or not num % 2: 
  10.         return False 
  11.     for div in range(3, int(math.sqrt(num) + 1), 2): 
  12.         if not num % div: 
  13.             return False 
  14.     return True 
  15. @njit 
  16. def run_program(N): 
  17.     total = 0 
  18.     for i in range(N): 
  19.         if is_prime(i): 
  20.             total += 1 
  21.     return total
  22. if __name__ == "__main__": 
  23.     N = 10000000 
  24.     start = time.time() 
  25.     total = run_program(N) 
  26.     end = time.time() 
  27.     print(f"total prime num is {total}") 
  28.     print(f"cost {end - start}s")

運(yùn)行一下,可以看出時間已經(jīng)從 47.39 秒降低到 3 秒。

 
 
 
 
  1. total prime num is 664579 
  2. cost 3.0948808193206787s

相比 C++ 的 2.3 秒還是有一點(diǎn)慢,你可能會說 Python 還是不行啊。等一等,我們還有優(yōu)化的空間,就是 Python 的 for 循環(huán),那可是 1000 萬的循環(huán),對此,Numba 提供了 prange 參數(shù)來并行計算,從而并發(fā)處理循環(huán)語句,只需要將 range 修改為 prange,裝飾器傳個參數(shù):parallel = True,其他不變,代碼改動如下:

 
 
 
 
  1. import math 
  2. import time 
  3. from numba import njit, prange 
  4. @njit 
  5. def is_prime(num): 
  6.     if num == 2: 
  7.         return True 
  8.     if num <= 1 or not num % 2:
  9.         return False 
  10.     for div in range(3, int(math.sqrt(num) + 1), 2): 
  11.         if not num % div: 
  12.             return False 
  13.     return True 
  14. @njit(parallel = True) 
  15. def run_program(N): 
  16.     total = 0 
  17.     for i in prange(N): 
  18.         if is_prime(i): 
  19.             total += 1 
  20.     return total 
  21. if __name__ == "__main__": 
  22.     N = 10000000 
  23.     start = time.time() 
  24.     total = run_program(N) 
  25.     end = time.time() 
  26.     print(f"total prime num is {total}") 
  27.     print(f"cost {end - start}s")

現(xiàn)在運(yùn)行一下:

 
 
 
 
  1. python isPrime.py 
  2. total prime num is 664579 
  3. cost 1.4398791790008545s

才 1.43 秒,比 C++ 還快,Numba 真的牛逼!我又運(yùn)行了兩次,確認(rèn)自己沒看錯,平均就是 1.4 秒:

Python

看到這里,Numba 又讓我燃起了對 Python 的激情,我不轉(zhuǎn) C++ 了,Python 夠用了。

Numba 如何做到的呢?官方文檔這樣介紹:它讀取裝飾函數(shù)的 Python 字節(jié)碼,并將其與有關(guān)函數(shù)輸入?yún)?shù)類型的信息結(jié)合起來,分析和優(yōu)化代碼,最后使用編譯器庫(LLVM)針對你的 CPU 生成量身定制的機(jī)器代碼。每次調(diào)用函數(shù)時,都會使用此編譯版本,你說牛逼不?

Numba 還有更多詳細(xì)的用法,這里不多說,想了解的請移步官方文檔[1]。

最后的話

Python 幾乎在每一個領(lǐng)域都有對應(yīng)的解決方案,本文提到的 Numba 庫就是專門解決 Python 在計算密集型任務(wù)方面性能不足的問題,如果你從事機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘等領(lǐng)域,這個會非常有幫助,如果本文對你有用,請點(diǎn)贊、在看、關(guān)注支持。


文章題目:Python可以比C++更快,你不信?
文章出自:http://www.dlmjj.cn/article/ccejhpc.html