linux3.x内核实时性改进,linux 3.x内核优化指南
1.1。Numba的約5分鐘指南 Numba是Python的即時(shí)編譯器,它最適用于使用NumPy數(shù)組和函數(shù)以及循環(huán)的代碼。使用Numba的最常用方法是通過(guò)其裝飾器集合,可以應(yīng)用于您的函數(shù)來(lái)指示Numba編譯它們。當(dāng)調(diào)用Numba修飾函數(shù)時(shí),它被編譯為機(jī)器代碼“及時(shí)”執(zhí)行,并且您的全部或部分代碼隨后可以以本機(jī)機(jī)器代碼速度運(yùn)行!
開(kāi)箱即用的Numba使用以下方法:
操作系統(tǒng):Windows(32位和64位),OSX和Linux(32位和64位) 架構(gòu):x86,x86_64,ppc64le。在armv7l,armv8l(aarch64)上進(jìn)行實(shí)驗(yàn)。 GPU:Nvidia CUDA。AMD ROC的實(shí)驗(yàn)。 CPython的 NumPy 1.10 - 最新 1.1.1。我怎么得到它? Numba可作為暢達(dá)包為 蟒蛇Python發(fā)布:
$ conda install numba Numba還有pip可供選擇:
$ pip install numba Numba也可以 從源代碼編譯,雖然我們不建議首次使用Numba用戶。
Numba通常用作核心包,因此其依賴性保持在絕對(duì)最小值,但是,可以按如下方式安裝額外的包以提供其他功能:
scipy- 支持編譯numpy.linalg功能。 colorama - 支持回溯/錯(cuò)誤消息中的顏色突出顯示。 pyyaml - 通過(guò)YAML配置文件啟用Numba配置。 icc_rt - 允許使用Intel SVML(高性能短矢量數(shù)學(xué)庫(kù),僅限x86_64)。安裝說(shuō)明在 性能提示中。 1.1.2。Numba會(huì)為我的代碼工作嗎? 這取決于你的代碼是什么樣的,如果你的代碼是以數(shù)字為導(dǎo)向的(做了很多數(shù)學(xué)運(yùn)算),經(jīng)常使用NumPy和/或有很多循環(huán),那么Numba通常是一個(gè)不錯(cuò)的選擇。在這些例子中,我們將應(yīng)用最基本的Numba的JIT裝飾器,@jit試圖加速一些函數(shù)來(lái)演示哪些有效,哪些無(wú)效。
Numba在代碼看起來(lái)像這樣:
from numba import jit import numpy as np
x = np.arange(100).reshape(10, 10)
@jit(nopython=True) # Set "nopython" mode for best performance def go_fast(a): # Function is compiled to machine code when called the first time trace = 0 for i in range(a.shape[0]): # Numba likes loops trace += np.tanh(a[i, i]) # Numba likes NumPy functions return a + trace # Numba likes NumPy broadcasting
print(go_fast(x)) 對(duì)于看起來(lái)像這樣的代碼,如果有的話,它將無(wú)法正常工作:
from numba import jit import pandas as pd
x = {'a': [1, 2, 3], 'b': [20, 30, 40]}
@jit def use_pandas(a): # Function will not benefit from Numba jit df = pd.DataFrame.from_dict(a) # Numba doesn't know about pd.DataFrame df += 1 # Numba doesn't understand what this is return df.cov() # or this!
print(use_pandas(x)) 請(qǐng)注意,Numba不理解Pandas,因此Numba只是通過(guò)解釋器運(yùn)行此代碼,但增加了Numba內(nèi)部開(kāi)銷的成本!
1.1.3。什么是nopython模式? Numba @jit裝飾器從根本上以兩種編譯模式運(yùn)行, nopython模式和object模式。在go_fast上面的例子中, nopython=True在@jit裝飾器中設(shè)置,這是指示Numba在nopython模式下操作。nopython編譯模式的行為本質(zhì)上是編譯裝飾函數(shù),以便它完全運(yùn)行而不需要Python解釋器的參與。這是使用Numba jit裝飾器的推薦和最佳實(shí)踐方式,因?yàn)樗梢詭?lái)最佳性能。
如果編譯nopython模式失敗,Numba可以編譯使用 ,如果沒(méi)有設(shè)置,這是裝飾器的 后退模式(如上例所示)。在這種模式下,Numba將識(shí)別它可以編譯的循環(huán)并將它們編譯成在機(jī)器代碼中運(yùn)行的函數(shù),并且它將運(yùn)行解釋器中的其余代碼。為獲得最佳性能,請(qǐng)避免使用此模式objectmode@jitnopython=Trueuse_pandas
1.1.4。如何衡量Numba的表現(xiàn)? 首先,回想一下,Numba必須為執(zhí)行函數(shù)的機(jī)器代碼版本之前給出的參數(shù)類型編譯函數(shù),這需要時(shí)間。但是,一旦編譯完成,Numba會(huì)為所呈現(xiàn)的特定類型的參數(shù)緩存函數(shù)的機(jī)器代碼版本。如果再次使用相同的類型調(diào)用它,它可以重用緩存的版本而不必再次編譯。
測(cè)量性能時(shí),一個(gè)非常常見(jiàn)的錯(cuò)誤是不考慮上述行為,并使用一個(gè)簡(jiǎn)單的計(jì)時(shí)器來(lái)計(jì)算一次,該計(jì)時(shí)器包括在執(zhí)行時(shí)編譯函數(shù)所花費(fèi)的時(shí)間。
例如:
from numba import jit import numpy as np import time
x = np.arange(100).reshape(10, 10)
@jit(nopython=True) def go_fast(a): # Function is compiled and runs in machine code trace = 0 for i in range(a.shape[0]): trace += np.tanh(a[i, i]) return a + trace
DO NOT REPORT THIS... COMPILATION TIME IS INCLUDED IN THE EXECUTION TIME!
start = time.time() go_fast(x) end = time.time() print("Elapsed (with compilation) = %s" % (end - start))
NOW THE FUNCTION IS COMPILED, RE-TIME IT EXECUTING FROM CACHE
start = time.time() go_fast(x) end = time.time() print("Elapsed (after compilation) = %s" % (end - start)) 這,例如打印:
Elapsed (with compilation) = 0.33030009269714355 Elapsed (after compilation) = 6.67572021484375e-06 衡量Numba JIT對(duì)您的代碼的影響的一個(gè)好方法是使用timeit模塊函數(shù)來(lái)執(zhí)行時(shí)間,這些函數(shù)測(cè)量多次執(zhí)行迭代,因此可以在第一次執(zhí)行時(shí)適應(yīng)編譯時(shí)間。
作為旁注,如果編譯時(shí)間成為問(wèn)題,Numba JIT支持 編譯函數(shù)的磁盤緩存,并且還具有Ahead-Of-Time編譯模式。
1.1.5。它有多快? 假設(shè)Numba可以在nopython模式下運(yùn)行,或者至少編譯一些循環(huán),它將針對(duì)您的特定CPU進(jìn)行編譯。加速因應(yīng)用而異,但可以是一到兩個(gè)數(shù)量級(jí)。Numba有一個(gè) 性能指南,涵蓋了獲得額外性能的常用選項(xiàng)。
1.1.6。Numba如何運(yùn)作? Numba讀取裝飾函數(shù)的Python字節(jié)碼,并將其與有關(guān)函數(shù)輸入?yún)?shù)類型的信息相結(jié)合。它分析并優(yōu)化您的代碼,最后使用LLVM編譯器庫(kù)生成函數(shù)的機(jī)器代碼版本,根據(jù)您的CPU功能量身定制。每次調(diào)用函數(shù)時(shí)都會(huì)使用此編譯版本。
1.1.7。其他感興趣的東西: Numba有相當(dāng)多的裝飾,我們看到@jit和@njit,但也有:
@vectorize- 生成NumPy ufunc(ufunc支持所有方法)。文件在這里。 @guvectorize- 產(chǎn)生NumPy廣義ufuncs。 文件在這里。 @stencil - 將函數(shù)聲明為類似模板操作的內(nèi)核。 文件在這里。 @jitclass - 對(duì)于jit感知類。文件在這里。 @cfunc - 聲明一個(gè)函數(shù)用作本機(jī)回調(diào)(從C / C ++等調(diào)用)。文件在這里。 @overload- 注冊(cè)您自己的函數(shù)實(shí)現(xiàn),以便在nopython模式下使用,例如@overload(scipy.special.j0)。 文件在這里。 一些裝飾者提供額外選項(xiàng):
parallel = True- 啟用功能的 自動(dòng)并行化。 fastmath = True- 為該功能啟用快速數(shù)學(xué)行為。 ctypes / cffi / cython互操作性:
cffi- 模式支持調(diào)用CFFI函數(shù)nopython。 ctypes- 模式支持調(diào)用ctypes包裝函數(shù)nopython。。 Cython導(dǎo)出的函數(shù)是可調(diào)用的。 1.1.7.1。GPU目標(biāo): Numba可以針對(duì)Nvidia CUDA和(實(shí)驗(yàn)性)AMD ROC GPU。您可以使用純Python編寫內(nèi)核,讓Numba處理計(jì)算和數(shù)據(jù)移動(dòng)(或明確地執(zhí)行此操作)。單擊關(guān)于CUDA或ROC的 Numba文檔 。
示例:接下來(lái)我們寫一段簡(jiǎn)單的代碼,來(lái)計(jì)算一下執(zhí)行時(shí)間:
示例1:不使用numba的:
import time
def num():
arr = []
for i in range(10000000):
arr.append(i)
stime = time.time() num() etime = time.time() - stime
print(arr)
print('用時(shí):{}秒'.format(etime)) 示例輸出時(shí)間:
用時(shí):1.4500024318695068秒
示例2:使用numba @jit
import time from numba import jit
@jit def num():
arr = []
for i in range(10000000):
arr.append(i)
stime = time.time() num() etime = time.time() - stime
print(arr)
print('用時(shí):{}秒'.format(etime)) 示例輸出:
用時(shí):0.5530002117156982秒
結(jié)論:
上述兩個(gè)示例代碼,一個(gè)使用了numba,另一個(gè)沒(méi)有使用numba;可以看出使用numba @jit裝飾后,時(shí)間明顯快了很多倍。
這只是一個(gè)簡(jiǎn)單示例;對(duì)于復(fù)雜計(jì)算提高速度更明顯。
總結(jié)
以上是生活随笔為你收集整理的linux3.x内核实时性改进,linux 3.x内核优化指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【LeetCode笔记】31. 下一个排
- 下一篇: 【学习笔记】第三章——内存 II(分页存