【问题标题】:Python: extra assignments in functionsPython:函数中的额外分配
【发布时间】:2012-02-01 03:52:59
【问题描述】:

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

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

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

【问题讨论】:

  • 我们大多数人都认为这无关紧要。因此投票结束。
  • +1 简单有趣的问题。

标签: memory-management python cpu-usage assign


【解决方案1】:

如果你想知道首选的 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 

【讨论】:

    【解决方案2】:

    对于第一个:

    >>> 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】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        相关资源
        最近更新 更多