引言
NumPy是Python頂用於科學打算的基本庫,它供給了高效的數組操縱跟數學函數。但是,在某些情況下,NumPy的機能可能會成為瓶頸。本文將介紹一些NumPy代碼減速的技能,幫助妳輕鬆晉升機能,告別打算瓶頸。
利用NumPy向量化操縱
NumPy的向量化操縱是其最大年夜的上風之一。向量化操縱容許妳利用數組表達式而不是顯式輪回,從而進步代碼的履行效力。
示例代碼
import numpy as np
# 非向量化操縱
result_nonvectorized = [np.sin(x) for x in arr]
# 向量化操縱
result_vectorized = np.sin(arr)
利用NumPy通用函數(ufuncs)
NumPy的通用函數(ufuncs)可能對數組停止逐元素操縱,它們在底層利用編譯的代碼履行操縱,從而進步機能。
示例代碼
# 非通用函數操縱
result_nonufunc = [np.sin(x) for x in arr]
# 通用函數操縱
result_ufunc = np.sin(arr)
np.cos(arr)
利用NumPy聚合操縱
NumPy的聚合操縱是對數組中的值停止打算的操縱,比方求跟、求均勻值等。NumPy的聚合操縱是經由過程底層優化實現的,因此比Python的內置函數更高效。
示例代碼
# 利用聚合操縱
arr = np.random.rand(1000000)
np.sum(arr)
np.mean(arr)
利用NumExpr停止機能優化
NumExpr是一個對NumPy打算式停止的機能優化東西。對複雜的打算,NumExpr可能明顯進步機能。
示例代碼
import numexpr as ne
import numpy as np
a = np.linspace(0, 1000, 1000)
print('# NumPy打算')
timeit.timeit('a**10', globals=globals(), number=1000)
print('# NumExpr打算')
timeit.timeit('ne.evaluate("a**10")', globals=globals(), number=1000)
利用Numba停止減速
Numba是一個基於LLVM的靜態編譯器,可能將Python代碼編譯成呆板碼,從而進步代碼的履行效力。
示例代碼
from numba import jit
@jit
def sumarray(array):
total = 0
for i in range(array.shape[0]):
total += array[i]
return total
# 創建數組
a = np.arange(1000000)
# 挪用Numba減速的函數
print(sumarray(a))
結語
經由過程以上技能,妳可能輕鬆晉升NumPy代碼的機能,從而告別打算瓶頸。在現實利用中,根據具體成績跟數據特點抉擇合適的優化方法,才幹達到最佳後果。