Python:函数中的额外赋值

2024-10-04 01:24:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

与使用额外赋值的case 1相比,case 1是否有额外的内存使用量和/或CPU使用量?在

案例1:

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

案例2:

^{pr2}$

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

更新:
我不知道Python中有反汇编程序!当我知道我的问题的答案和检查类似想法的方法时,真是太棒了。特别感谢。
from dis import dis as dasm
dasm(f)


Tags: 对象函数内存版本returndef情况cpu
3条回答

首选的样式是对该特定函数最具可读性的样式。一旦你有了可读的、正确的代码,你可能就完成了。如果性能在这一点上是一个问题,那么分析一下瓶颈在哪里,并在这些地方下功夫。在

It is easier to optimize correct code than to correct optimized code.

如果您想知道什么样的Python样式是首选的,请查看标准库中的代码:

$ grep return Lib/*py

您将看到case 2样式是最常见的。在

我个人只在需要变量名以增加代码清晰度时使用赋值表:

^{pr2}$

这段代码的一小部分开销

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

对于第一个:

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

对于第二个:

^{pr2}$

正如您所看到的,分配某些东西会有一个(轻微的)成本,即使您根本不使用它,除了在返回之前保留值。在

相关问题 更多 >