2013-03-14 120 views
18

python numexpr將數值分配給您正在操作的同一個數組以避免創建臨時數組是否安全?numexpr.evaluate(「a + b」,out = a)

project homepage上的內存使用描述看起來沒問題,但沒有潛入源代碼,這是一個很難回答的問題。

我想它的工作原理以下罰款,但我希望從別人更熟悉這個包確認:

import numpy as np 
import numexpr as ne 
a = np.ones(5) 
b = a.copy() 
ne.evaluate("a+b",out=a) 
array([ 2., 2., 2., 2., 2.]) 
+7

我不能想到一個它不會安全的情況(很多索引技巧可能會導致問題在數據庫中不起作用)。在附註中,對於像例子這樣的簡單情況,注意:'np.add(a,b,out = a)'也是有用的。 'numexpr'非常好,但如果不需要其他依賴項,就可以避免沒有它的臨時數組。 – 2013-03-15 00:19:08

回答

7

它的工作原理,因爲numexpr仍處於1024塊大小使用臨時陣列內部,儘管元素(如果使用VML,則爲4096)。您可以將這些輸入塊視爲切片,儘管在評估過程中它們被存儲爲適當的C數據類型,以提高速度和內存的緊湊性。在執行每個塊的計算之後,結果將存儲到out參數中,否則它必須分配一個與輸入大小相同的數組。

查看Why It Works這個部分,瞭解如何計算數學向量化算術的僞代碼。

相關問題