为什么Python不会优化掉临时变量?

2024-06-16 13:15:09 发布

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

Fowler的Extract Variable重构方法,以前是Introduce Explaining Variable,它说使用一个临时变量使代码更清晰。这样做的目的是通过引入一个不需要的局部变量来阐明复杂的代码,并为便于说明而命名该变量。它也提倡这样的解释而不是评论。。Other languages优化掉临时变量,这样就没有时间或空间资源的成本。为什么Python不这样做呢?在

In [3]: def multiple_of_six_fat(n):
   ...:     multiple_of_two = n%2 == 0
   ...:     multiple_of_three = n%3 == 0
   ...:     return multiple_of_two and multiple_of_three
   ...:

In [4]: def multiple_of_six_lean(n):
   ...:     return n%2 == 0 and n%3 == 0
   ...:
^{pr2}$

Tags: andof方法代码inreturndefextract
2条回答

因为Python是一种高度动态的语言,引用可以影响行为。在

例如,比较以下各项:

>>> id(object()) == id(object())
True
>>> ob1 = object()
>>> ob2 = object()
>>> id(ob1) == id(ob2)
False

如果Python“优化”了ob1ob2变量,行为就会改变。在

Python对象的生存期由引用计数控制。将weak references添加到mix plus线程中,您将看到优化掉变量(即使是局部变量)可能导致不希望的行为更改。在

此外,在Python中,从性能的角度来看,删除这些变量几乎不会改变任何东西。本地名称空间已经高度优化(值是通过数组中的索引查找的);如果您担心取消引用局部变量的速度,那么您对项目的时间关键部分使用了错误的编程语言。在

Issue 2181(在函数末尾优化局部变量)有一些有趣的地方:

  • 这会使调试更加困难,因为符号不再 存在。Guido says only do it for -O.
  • 可能会破坏inspect或{}的一些用法。在
  • 更改对象的生存期。例如,下例中的myfunc在优化后可能会失败,因为此时Python保证在函数退出之前文件对象不会关闭。(风格不好,但还是)

    def myfunc():
        f = open('somewhere', 'r')
        fd = f.fileno()
        return os.fstat(fd)
    

    不能重写为:

    ^{2美元
  • 一位核心开发人员说:“在现实世界中,不太可能提高代码的速度,我不认为我们应该增加编译器的复杂性。”

相关问题 更多 >