2016-05-23 34 views
0

試圖加速潛在的流動空氣動力學求解器。我不使用相對昂貴的公式計算任意點的速度,而是試圖預先計算速度場,以便插入數值並(有希望)加速代碼。結果是由於(我認爲)對每次調用運行的scipy.interpolate.RegularGridInterpolator方法的減速。如何緩存這個調用的結果函數?我嘗試過的所有東西都會導致哈希錯誤。如何緩存由scipy插值返回的函數

我有一個方法實現插值器和第二個'工廠'方法來減少參數列表,以便它可以在ODE求解器中使用。

x_panels和y_panels是一維數組/元組,小平面是二維數組/元組,x和y是浮點數。

def _vol_vel_factory(x_panels, y_panels, vels): 
# Function factory method 
def _vol_vel(x, y, t=0): 
    return _volume_velocity(x, y, x_panels, y_panels, vels) 
return _vol_vel 

def _volume_velocity(x, y, x_panels, y_panels, vels): 
velfunc = sp_int.RegularGridInterpolator(
     (x_panels, y_panels), vels 
     ) 
return velfunc(np.array([x, y])).reshape(2) 

通過使元組而不是陣列作爲輸入我能夠得到位進一步但是轉換方法輸出到元組沒有做出的差;我仍然有哈希錯誤。

在任何情況下,緩存_volume_velocity方法的結果都不是我想要做的,我真的想緩存_vol_vel_factory的結果,其結果是一個函數。我不確定這是否是一個有效的概念。

+0

的可能的複製[什麼是記憶化以及如何使用它在Python?](http://stackoverflow.com/questions/1988804/what-is-memoization-and-how-can- I-使用,是功能於蟒蛇) –

回答

0

scipy.interpolate.RegularGridInterpolator返回一個numpy數組。這是不可緩存的,因爲它不實現散列

您可以存儲numpy數組的其他表示,然後將其轉換回numpy數組。有關如何執行此操作的詳細信息,請參閱以下內容。

How to hash a large object (dataset) in Python?