簡體   English   中英

在Python / Numpy中優化許多Matrix操作

[英]Optimizing Many Matrix Operations in Python / Numpy

在編寫一些數值分析代碼時,我對需要許多Numpy調用的函數進行了瓶頸處理。 我不完全確定如何進一步進行性能優化。

問題:

該函數通過計算以下內容來確定錯誤,

錯誤功能

碼:

def foo(B_Mat, A_Mat):
    Temp = np.absolute(B_Mat)
    Temp /= np.amax(Temp)
    return np.sqrt(np.sum(np.absolute(A_Mat - Temp*Temp))) / B_Mat.shape[0]

什么是從代碼中擠出一些額外性能的最佳方法? 我最好的行動方案是使用Cython在單個for循環中執行大部分操作來減少臨時數組嗎?

實現中存在可以卸載到numexpr模塊的特定函數,已知這些函數對於算術計算非常有效。 對於我們的情況,具體來說我們可以用它來執行平方,求和和絕對計算。 因此,基於numexpr的解決方案將取代原始代碼中的最后一步,就像這樣 -

import numexpr as ne

out = np.sqrt(ne.evaluate('sum(abs(A_Mat - Temp**2))'))/B_Mat.shape[0]

通過將規范化步驟嵌入到numexpr的evaluate表達式中,可以實現進一步的性能提升。 因此,修改為使用numexpr的整個函數將是 -

def numexpr_app1(B_Mat, A_Mat):
    Temp = np.absolute(B_Mat)
    M = np.amax(Temp)
    return np.sqrt(ne.evaluate('sum(abs(A_Mat*M**2-Temp**2))'))/(M*B_Mat.shape[0])

運行時測試 -

In [198]: # Random arrays
     ...: A_Mat = np.random.randn(4000,5000)
     ...: B_Mat = np.random.randn(4000,5000)
     ...: 

In [199]: np.allclose(foo(B_Mat, A_Mat),numexpr_app1(B_Mat, A_Mat))
Out[199]: True

In [200]: %timeit foo(B_Mat, A_Mat)
1 loops, best of 3: 891 ms per loop

In [201]: %timeit numexpr_app1(B_Mat, A_Mat)
1 loops, best of 3: 400 ms per loop

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM