为什么Python枚举慢?

时间:2015-01-01 23:36:34

标签: performance python-3.x enums

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

class SpecialCharacters(Enum):

    TONE_NUMBERS = ["0", "1", "2", "3", "4"]

像这样访问它:

SpecialCharacters.TONE_NUMBERS.value

在课堂上访问值时的示例:

self.TONE_NUMBERS

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

(将他们外包的目标是,他们可以用于其他课程,而其他课程则无需访问他们无关的课程。)

我的python版本是3.4。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

回答问题Why?

Enum的原始设计是让成员成为虚拟属性。这意味着它们不会保存在Enum类字典中,这意味着每次查找都可能首先失败,然后在类上调用__getattr__并找到成员。

所以基本上很多忙碌的工作。

修复是尽可能将成员放在类字典中(大部分时间都是这样)。