讓python運行速度更快
- 1、引言
- 2、Numba
- 2.1 簡介
- 2.2 安裝
- 2.3 代碼實體
- 3、 代碼實戰
- 3.1 不使用Numba
- 3.2 使用Numba
- 4、總結
1、引言
小屌絲:魚哥,我今天被鄙視了
小魚:因為你的顏值被鄙視了??
小屌絲:咱還能正常聊天嗎??
小魚:好吧,我已經很正經的說話了,那你說吧,因為啥被鄙視了?
小屌絲:今天一個小菜鳥說C語言是世界上運行速度最快的語言,我非常不服氣~~
小魚:那有啥不服氣的,我都覺得這話說得沒啥毛病,
小屌絲:魚哥,小姐姐說誰的速度快,就跟誰YYSX,
小魚:那…這… 我贊同,我也表示不服,
看樣子,小姐姐是動力的源頭!

2、Numba
關于Numba的詳細檔案,點擊Numba傳送門即被可傳送,
但是檔案歸檔案,我們還是要簡單的說一下Numba,
2.1 簡介
numba 是一款可以將 python 函式編譯為機器代碼的JIT編譯器,經過 numba 編譯的python 代碼(僅限陣列運算),其運行速度可以接近 C 或 FORTRAN 語言,
小屌絲:看樣子很厲害的哦,那使用起來,是不是很難呢?
小魚:不難不難,到底有多容易,請往下看:
三不要:
- 不需要替換Python決議器
- 不需要單獨編譯
- 不需要安裝C/C++編譯器
一需要:
- 將 Numba 提供的裝飾器放在 Python 函式上面就行
小屌絲:哎喲~總結的還挺到位,
小魚:沒事別說話,打斷我思路了都!!
2.2 安裝
在擼碼前,需要確認,是否已經有numba這個庫,
如果沒有的話,那我們回想一下,有幾種方法呢???
- 一行代碼匯入Python所有庫
- pip install 手動安裝
- pip.main自動安裝
不管哪種方法,能安裝上就是可行的,
在這里,小魚就直接舉例單獨安裝:
pip install numba
詳細可參考:
《Python3:我低調的只用一行代碼,就匯入Python所有庫!》;
《Python3,選擇Python自動安裝第三方庫,從此跟pip說拜拜!!》
2.3 代碼實體
安裝完numba庫,那就直接上代碼,展示一下速度…
看看能不能比我們的蘇神跑的快!
實體一:
我們看看呼叫jit的樣子
# -*- coding:utf-8 -*-
# @Time : 2021-08-08
# @Author : carl_DJ
from numba import jit
import random
# 呼叫jit裝飾器
@jit(nopython=True)
def mot_pi(nsamples):
acc =0
for i in range(nsamples):
x = random.random()
y = random.random()
if (x ** 2 + y ** 2) <1.0 :
acc +=1
return 8.0 * acc /nsamples
實體二
Numba 是專為科學計算而設計的,在與 NumPy 一起使用時,Numba 會為不同的陣列資料型別生成專門的代碼,以優化性能為主,
上代碼:
# -*- coding:utf-8 -*-
# @Time : 2021-08-08
# @Author : carl_DJ
@numba.jit(nopython=True, parallel=True)
def logistic_regress(X, Y, w, iterations):
for i in range(iterations):
w -= np.dot(((1.0 /
(1.0 + np.exp(-Y * np.dot(X, w)))
- 1.0) * Y), X)
return w
小屌絲:這個…我看不懂…
小魚:看不懂啊,沒關系,畢竟不是每個人都對科學計算有興趣,
小屌絲:你這是在侮(xiu)辱我!!!
小魚:你不配~ ~
如果大家看不懂這個實體,沒事沒事,別灰心,
接下來,我們就來搞個大一點的事情,

3、 代碼實戰
上面的代碼,就是一個熱身了~ ~
接下來,我們就用正兒八經的例子,看看Numba的運行速度有多快,
有了蘇神的速度,還擔心妹子不跟咱YYXS嗎!!

舉個例子
我們使用和不使用Numba,來找出1000個W以內所有的素數,
3.1 不使用Numba
我們不使用Numba,來看看花費多長時間,
上代碼
# -*- coding:utf-8 -*-
# @Time : 2021-08-08
# @Author : carl_DJ
import math
import time
def is_prime(num):
if num == 2:
return True
if num <= 1 or not num % 2:
return False
for div in range(3, int(math.sqrt(num) + 1), 2):
if not num % div:
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"1000W以內所有的素數是: {total}")
print(f"耗時: {end - start}s")
運行結果
1000W以內所有的素數是: 664579
耗時: 245.93426966667175s
小屌絲:好吧,這運行速度,確實有點…
小魚:別灰心啊,我們不是還有Numba嗎,
3.2 使用Numba
我們使用Numba,看看花費多長時間,
上代碼
# -*- coding:utf-8 -*-
# @Time : 2021-08-08
# @Author : carl_DJ
import math
import time
from numba import njit
# @njit 相當于 @jit(nopython=True)
@njit
def is_prime(num):
if num == 2:
return True
if num <= 1 or not num % 2:
return False
for div in range(3, int(math.sqrt(num) + 1), 2):
if not num % div:
return False
return True
# #普通回圈計算,
# @njit
# def run_program(N):
# total = 0
# #普通range回圈處理
# for i in range(N):
# if is_prime(i):
# total += 1
# return total
#使用Numba的prange來進行并發回圈計算
@njit(parallel = True)
def run_program(N):
total = 0
#使用Numba提供的prange引數來進行并行計算
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"1000W以內所有的素數是: {total}")
print(f"耗時: {end - start}s")
運行結果
- 未使用Numba的prange運行結果,如下:
1000W以內所有的素數是: 664579
耗時: 11.453454494476318s
- 使用Numba的prange運行結果,如下:
total prime num is 664579
cost 5.30582857131958s

小屌絲:我的天啊, 這么神奇嗎~
小魚:必須的,
小屌絲:魚哥,魚哥,它是怎么做到的??
小魚:嗯,我們來看看官方檔案怎么解釋的,
官方檔案解釋:
它讀取裝飾函式的 Python 位元組碼,并將其與有關函式輸入引數型別的資訊結合起來,分析和優化代碼,最后使用編譯器庫(LLVM)針對你的 CPU 生成量身定制的機器代碼,每次呼叫函式時,都會使用此編譯版本,
小屌絲:原來如此…看來我今晚和小姐姐YYSX 是有戲了,
小魚:就這點出息了!!!
4、總結
雖然Python是動態語言,有全域解釋器鎖,比其他靜態語言要慢,
但是,通過今天小魚分享的Numba,是不是把你心中那一團火又燃燒了,
說歸說,鬧歸鬧,官方檔案最重要!
所以,關于更多的Numba的知識,還請異步到官方檔案
倒數三個數,開始上鏈接,寶寶們準備好,
3
2
1
官網檔案:http://numba.pydata.org/numba-doc/latest/index.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/293461.html
標籤:python
