在了itertools模塊裏的文檔,我發現這條評論設置局部變量的函數,而不是使用全局優化功能
def dotproduct(vec1, vec2):
return sum(imap(operator.mul, vec1, vec2))
注意,許多上述配方可以通過替換全局優化 將局部變量定義爲默認值的查找。例如, 的dotproduct配方可以寫爲:
def dotproduct(vec1, vec2, sum=sum, imap=imap, mul=operator.mul):
return sum(imap(mul, vec1, vec2))
怎麼回事?
是否有一個實際明顯的加速(可以平衡較大功能簽名的不便)?
在哪些特定條件下,使用案例中的局部變量如所示那樣是相關的?
編輯:我用timeit測試過,並且有任何相關的區別。
對於兩個40項的列表作爲VEC 1,VEC 2:
全局查找 - > 3.22720959404
本地查找 - > 3.19884065683
也就是說,只有約1%的收益。
如果你打電話的時間一致的方法數量龐大,可以考慮創建一個別名'FUNC = module.func'以防止每次引用該方法時在模塊中查找。雖然我不會覺得麻煩,但我從來沒有發現它明顯更快,而且通常只會讓代碼更難閱讀。爲自己測試並決定。 – tomasz
我真的很討厭那個具體的例子。假設有人誤將'dotproduct((1,2),(3,4))'作爲'dotproduct(1,2,3,4)'(當我將一些參數傳遞給一個真正期望的單個參數是一個值列表)。在第一個定義中,用戶會得到一個TypeError來傳遞錯誤的參數數量。在第二個定義中,用戶會默默覆蓋'sum'和'imap'。至少可以說這是令人驚訝的。 –
1%的收益並不是顯着差異;它可以 (!)如果在輸入尺寸向無窮大方向增長時保持1%,那麼它的效果會很顯着,但是NumPy確實能夠將產品的點數加快幾個數量級。我不會爲了這樣一個小小的好處而改變界面。這是過早的優化。 –