
矩陣與向量計算
|
129
numexpr ︰讓就地操作更快速且更容易
numpy
的向量運算最佳化的一個缺點是它一次只發生在一個操作上,也就是說,在我們
使用
numpy
向量進行
A
*
B
+
C
的操作時,首先,整個
A
*
B
的操作完成,資料被儲存在暫
時性的向量中;接著,這個新向量被加上
C
。範例 6-14 的擴散程式碼的就地版本很清楚
地顯示這件事。
不過,有許多模組能夠幫忙處理這個問題。
numexpr
模組能夠將整個向量運算式(vector
expression)編譯成非常有效率的程式碼,這段程式碼經過最佳化,將快取未命中與使
用的暫時性空間減到最小。另外,這些運算式能夠利用多個 CPU 核心(更多資訊,請
參閱第 9 章),以及針對 Intel 晶片的特殊化指令,讓效能最大化。
把程式碼改為使用
numexpr
是非常容易的︰只要將運算式重寫成具有指向區域變數之參
考的字串。這些運算式在幕後被編譯(並且被快取,好讓對相同運算式的呼叫不會引發
相同的編譯成本),並且使用最佳化的程式碼來執行。範例 6-19 顯示,將
evolve
函式改
為使用
numexpr
是非常簡單的,在此案例中,我們選擇使用
evaluate
函式的
out
參數,
好讓
numexpr
不去配置要將計算結果回傳給它的新向量。
範例
6-19
使用
numexpr
進一步最佳化大型矩陣運算
from numexpr import evaluate
def evolve(grid, dt, next_grid, D=1):
laplacian(grid, next_grid) ...