成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python可以比C++更快,你不信?

開發 后端
今天分享一個可以讓 Python 比 C++ 還要快的技術,看完再決定要不要轉吧。

[[412719]]

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

今天的主角就是 Numba,Numba 是一個開源的即時編譯器(JIT compiler),可將 Python 和 NumPy 的代碼的轉換為快速的機器碼,從而提升運行速度。可以達到 C 或 FORTRAN 的速度。

這么牛逼是不是很難用呢?No,No,No,So easy,你不需要替換 Python 解釋器,不需要單獨編譯,甚至不需要安裝 C / C ++ 編譯器。只需將 Numba 提供的裝飾器放在 Python 函數上面就行,剩下的就交給 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 是專為科學計算而設計的,在與 NumPy 一起使用時,Numba 會為不同的數組數據類型生成專門的代碼,以優化性能: 

  1. @numba.jit(nopython=Trueparallel=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 

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

  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") 

執行耗時: 

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

C++ 代碼如下: 

  1. #include <iostream>  
  2. #include <cmath>  
  3. #include <time.h>  
  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.  
  14. int run_program(int N){  
  15.     int total = 0 
  16.     for (int i; i < N; i++) {  
  17.         if(isPrime(i)) total ++;  
  18.     }  
  19.     return total;  
  20.  
  21. int main()  
  22.  
  23.     int N = 10000000 
  24.     clock_t start,end;  
  25.     start = clock();  
  26.     int total = run_program(N);  
  27.     end = clock();  
  28.     cout << "total prime num is " << total 
  29.     cout << "\ncost " << (end - start) / ((double) CLOCKS_PER_SEC) << "s\n";  
  30.     return 0;  
  31.  
  1. $ g++ isPrime.cpp -o isPrime  
  2. $ ./isPrime  
  3. total prime num is 664579  
  4. cost 2.36221s 

c++

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

  1. import math  
  2. import time  
  3. from numba import njit  
  4. # @njit 相當于 @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") 

運行一下,可以看出時間已經從 47.39 秒降低到 3 秒。 

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

相比 C++ 的 2.3 秒還是有一點慢,你可能會說 Python 還是不行啊。等一等,我們還有優化的空間,就是 Python 的 for 循環,那可是 1000 萬的循環,對此,Numba 提供了 prange 參數來并行計算,從而并發處理循環語句,只需要將 range 修改為 prange,裝飾器傳個參數: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") 

現在運行一下: 

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

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

Python

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

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

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

最后的話

Python 幾乎在每一個領域都有對應的解決方案,本文提到的 Numba 庫就是專門解決 Python 在計算密集型任務方面性能不足的問題,如果你從事機器學習、數據挖掘等領域,這個會非常有幫助,如果本文對你有用,請點贊、在看、關注支持。 

 

責任編輯:龐桂玉 來源: Python編程
相關推薦

2010-01-20 17:32:16

C++函數

2010-01-26 09:40:23

C++代碼

2022-10-09 10:02:09

Python3.12

2021-01-13 10:51:08

PromissetTimeout(函數

2024-07-26 00:22:34

2018-05-15 11:14:07

面試官C++編程

2017-11-07 12:43:13

PythonC++語言

2013-08-15 10:05:16

代碼

2009-10-22 09:17:16

C++ CLR

2020-11-09 10:01:29

Python乘法位運算

2024-08-12 12:25:25

SpringMVC開發

2021-03-01 21:32:49

HTTP2 QUIC

2021-09-03 10:44:42

ThreadLocalObject 數組

2021-07-17 22:57:07

開發框架工具

2014-12-02 14:05:09

OneAPM阿里云

2019-01-21 09:02:03

C++Python編程語言

2021-03-26 10:35:49

C++Python編程語言

2022-07-13 09:05:19

C++Git 分支測試

2020-03-10 08:33:04

HTTP演變協議

2023-09-14 15:48:53

排序測試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本网站在线看 | 欧美一区免费 | 久久精品播放 | 欧美美女爱爱 | 国产欧美一区二区三区日本久久久 | 国产精品区二区三区日本 | 91久久久久久 | 一区二区电影网 | 午夜国产一级片 | 国产精品激情在线 | 久久精品亚洲精品 | 国产蜜臀| 成人午夜视频在线观看 | 精品国产aⅴ| 国产亚洲一区二区三区在线观看 | 成人在线亚洲 | 久久国产精品免费一区二区三区 | 欧洲精品久久久久毛片完整版 | 成人欧美一区二区三区在线播放 | 亚洲精品永久免费 | 欧美久久久久久久久 | 国产一级网站 | 一区中文字幕 | 精品一二区 | 日本特黄a级高清免费大片 成年人黄色小视频 | 成人免费观看视频 | www.99re| 一二三在线视频 | 久久狠狠| 可以在线看的黄色网址 | www.欧美视频 | 黄网站在线观看 | 成人av电影网 | 国产亚洲二区 | 欧美日韩视频 | 天天综合网91 | 亚洲精品国产一区 | 亚洲精品乱码久久久久久蜜桃 | 日韩精品久久 | www国产亚洲精品 | 亚洲国产高清高潮精品美女 |