2012-01-03 24 views
2

考慮到以下兩個版本的簡單函數Python,問題是哪一個比另一個更受歡迎,爲什麼?Python:函數中的額外分配

是否有哪些附加任務已使用任何額外的內存使用和或CPU使用率case 1相比case 2

殼體1:

 
def f(x): 
    y = x*x 
    return y 

殼體2:

 
def f(x): 
    return x*x 

從我的觀點來看,case 1是比另一個更清晰尤其是在複雜的計算的情況下和提供許多返回的對象。另一方面,case 2看起來非常緊湊,所以會被認爲是非常有吸引力的。由於簡單就是高效。你怎麼看?

更新:
我不知道Python中有反彙編器!當我知道我的問題的答案和檢查類似想法的方式時,這真是太棒了。特別欣賞。
from dis import dis as dasm
dasm(f)

+0

大部分人都認爲沒關係。因此投票結束。 – 2012-01-03 00:40:48

+2

+1簡單而有趣的問題。 – Developer 2012-01-03 06:03:50

回答

7

如果你想知道什麼Python的風格是首選,看代碼的標準庫:

$ grep return Lib/*py 

您將看到case 2風格是最常見的。

我個人使用的分配形式,只有當需要的變量名添加清晰度代碼:

normalized_query = query.replace(' ', '').lower() 
return normalized_query 

該代碼引入了分配的很小一些開銷:

>>> def f(x): 
     return x + 2 

>>> def g(x): 
     y = x + 2 
     return y 

>>> dis(f) 
    2   0 LOAD_FAST    0 (x) 
       3 LOAD_CONST    1 (2) 
       6 BINARY_ADD   
       7 RETURN_VALUE   
>>> dis(g) 
    2   0 LOAD_FAST    0 (x) 
       3 LOAD_CONST    1 (2) 
       6 BINARY_ADD   
       7 STORE_FAST    1 (y) 

    3   10 LOAD_FAST    1 (y) 
      13 RETURN_VALUE 
+0

非常好的解釋和直接的答案。特別感謝。 – Developer 2012-01-03 06:09:44

3

對於第一個:

>>> dis.dis(f) 
    2   0 LOAD_FAST    0 (x) 
       3 LOAD_FAST    0 (x) 
       6 BINARY_MULTIPLY  
       7 STORE_FAST    1 (y) 

    3   10 LOAD_FAST    1 (y) 
      13 RETURN_VALUE 

對於第二個:

>>> dis.dis(f) 
    2   0 LOAD_FAST    0 (x) 
       3 LOAD_FAST    0 (x) 
       6 BINARY_MULTIPLY  
       7 RETURN_VALUE 

正如你所看到的,有一個在指定的東西(輕微)的成本,即使你不使用它在所有除返回之前持有的價值。

3

首選樣式是對於特定功能最具可讀性的樣式。一旦你有可讀的,正確的代碼 - 你可能已經完成了。 如果性能在這一點上是個問題,那麼查看瓶頸位置的配置文件,並在這些位置上工作。

優化正確的代碼比糾正優化的代碼更容易。

+0

這是一個很好的點,雖然是一般的。 – Developer 2012-01-03 06:08:47

相關問題