2

将以下内容视为Python中一个非常简单的函数的两个版本,问题是哪一个比另一个更受欢迎,为什么?

与使用额外分配的情况相比,是否有任何额外的内存使用和/或CPU 使用?case 1case 2

情况1:

定义 f(x):
    y = x*x
    返回 y

案例2:

定义 f(x):
    返回 x*x

从我的角度来看,case 1它比另一个更清晰,尤其是在复杂计算和提供许多返回对象的情况下。另一方面,case 2看起来非常紧凑,会被认为是非常有吸引力的。因为简单就是简单有效。你怎么看?

更新:
我不知道 Python 中有反汇编程序!当我了解到我的问题的答案以及检查类似想法的方法时,真是太神奇了。特别赞赏。
from dis import dis as dasm
dasm(f)

4

3 回答 3

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 
于 2012-01-03T00:22:29.003 回答
3

首选样式是对该特定功能最易读的样式。一旦你有了可读的、正确的代码——你可能已经完成了。 如果此时性能是一个问题,请分析以查看瓶颈所在,并在这些位置上工作。

优化正确的代码比纠正优化的代码更容易。

于 2012-01-03T02:18:43.497 回答
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

如您所见,即使您根本不使用它,除了在返回之前保留该值外,分配某些东西也会产生(少量)成本。

于 2012-01-03T00:25:04.280 回答