Python:函数中的额外赋值

时间:2012-01-03 00:16:27

标签: memory-management python cpu-usage assign

Python 中考虑以下两个版本的非常简单的函数,问题是哪一个优先于另一个,为什么?

case 1与使用了其他作业的case 2相比,是否还有内存使用率 CPU使用率

案例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)

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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

正如你所看到的,即使你没有使用它,除非在返回之前保留该值,否则分配内容会有(轻微)成本。

答案 2 :(得分:3)

首选样式是对该特定功能最具可读性的样式。一旦你有可读的,正确的代码 - 你可能已经完成了。 如果此时性能是一个问题,请查看配置文件以查看瓶颈所在,并处理这些问题。

  

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