今天我尝试将我的一些“最终”值(我的班级成员)从一个类外包给一个Enum。我运行了我编写的单元测试并注意到,测试需要比以前更长的时间才能完成。当我把这些“最终”值重新放回课堂时,一切都恢复了原来的速度。这里是我在Enum中访问它们时的一个例子:
class SpecialCharacters(Enum):
TONE_NUMBERS = ["0", "1", "2", "3", "4"]
像这样访问它:
SpecialCharacters.TONE_NUMBERS.value
在课堂上访问值时的示例:
self.TONE_NUMBERS
所以我想知道为什么当我把值放在Enum中时,我的测试花了3倍(!)的时间。它应该是对另一个班级成员的简单调用,但我认为这不会产生如此大的差异。
(将他们外包的目标是,他们可以用于其他课程,而其他课程则无需访问他们无关的课程。)
我的python版本是3.4。
答案 0 :(得分:5)
这是Python 3.4的枚举中的一个已知错误:https://bugs.python.org/issue23486
它已被修复"在Python 3.5中,枚举属性查找只比正常情况慢3倍,而不是20倍。
答案 1 :(得分:4)
回答问题Why?
:
Enum
的原始设计是让成员成为虚拟属性。这意味着它们不会保存在Enum
类字典中,这意味着每次查找都可能首先失败,然后在类上调用__getattr__
并找到成员。
所以基本上很多忙碌的工作。
修复是尽可能将成员放在类字典中(大部分时间都是这样)。