为什么Python枚举慢?

Zel*_*ahl 7 performance enums python-3.x

今天我尝试将我的一些"最终"值(我的班级成员)从一个类外包给一个Enum.我运行了我编写的单元测试并注意到,测试需要比以前更长的时间才能完成.当我把这些"最终"值重新放回课堂时,一切都恢复了原来的速度.这里是我在Enum中访问它们时的一个例子:

class SpecialCharacters(Enum):

    TONE_NUMBERS = ["0", "1", "2", "3", "4"]
Run Code Online (Sandbox Code Playgroud)

像这样访问它:

SpecialCharacters.TONE_NUMBERS.value
Run Code Online (Sandbox Code Playgroud)

它们在类中时访问值的示例:

self.TONE_NUMBERS
Run Code Online (Sandbox Code Playgroud)

所以我想知道为什么当我将值放入Enum时,我的测试需要花费3倍(!)的时间.它应该是对另一个班级成员的简单调用,但我认为这不会产生如此大的差异.

(将它们外包的目标是它们可用于其他类,而其他类不必访问与它们无关的类.)

我的python版本是3.4.

Bin*_*gsF 6

这是Python 3.4的枚举中的已知错误:https://bugs.python.org/issue23486

它已在Python 3.5中"修复",因此枚举属性查找仅比正常情况慢3倍,而不是20倍.


Eth*_*man 6

要回答这个问题Why?

最初的设计Enum是使成员成为虚拟属性。这意味着它们没有保留在Enum类字典中,这意味着所有可能的查找都必须首先失败,然后__getattr__在类上调用并找到成员。

所以基本上是忙碌的工作。

解决方法是在可能的情况下(多数情况下)将成员放入类字典中。