为什么 Python 枚举很慢?
Why are Python Enums slow?
今天我试图将我的一些 "final" 值(我的 class 的成员)从 class 外包给枚举。我运行了我编写的单元测试并注意到,测试需要比以前更长的时间才能完成。当我将这些 "final" 值放回 class 时,一切又回到了原来的速度。这是一个示例,说明当它们在枚举中时我如何访问它们:
class SpecialCharacters(Enum):
TONE_NUMBERS = ["0", "1", "2", "3", "4"]
像这样访问它:
SpecialCharacters.TONE_NUMBERS.value
访问 class 中的值的示例:
self.TONE_NUMBERS
所以我想知道为什么当我将值放入枚举时我的测试花费了 3 倍(!)的时间。这应该是对另一个 class' 成员的简单调用,但我想这不会产生太大的不同。
(外包它们的目的是让其他 classes 可以使用它们,而其他 classes 不必访问他们拥有的 class无事可做。)
我的 python 版本是 3.4。
这是 Python 3.4 枚举中的已知错误:https://bugs.python.org/issue23486
"fixed" 在 Python 3.5 中,枚举属性查找仅比正常速度慢 3 倍,而不是 20 倍。
回答问题Why?
:
Enum
的最初设计是让成员成为虚拟属性。这意味着它们没有保存在 Enum
class 字典中,这意味着每次可能的查找都必须首先失败,然后 __getattr__
将在 class 和找到成员。
所以基本上工作很忙。
解决方法是尽可能将成员放入 class 字典中(大多数情况下是这样)。
今天我试图将我的一些 "final" 值(我的 class 的成员)从 class 外包给枚举。我运行了我编写的单元测试并注意到,测试需要比以前更长的时间才能完成。当我将这些 "final" 值放回 class 时,一切又回到了原来的速度。这是一个示例,说明当它们在枚举中时我如何访问它们:
class SpecialCharacters(Enum):
TONE_NUMBERS = ["0", "1", "2", "3", "4"]
像这样访问它:
SpecialCharacters.TONE_NUMBERS.value
访问 class 中的值的示例:
self.TONE_NUMBERS
所以我想知道为什么当我将值放入枚举时我的测试花费了 3 倍(!)的时间。这应该是对另一个 class' 成员的简单调用,但我想这不会产生太大的不同。
(外包它们的目的是让其他 classes 可以使用它们,而其他 classes 不必访问他们拥有的 class无事可做。)
我的 python 版本是 3.4。
这是 Python 3.4 枚举中的已知错误:https://bugs.python.org/issue23486
"fixed" 在 Python 3.5 中,枚举属性查找仅比正常速度慢 3 倍,而不是 20 倍。
回答问题Why?
:
Enum
的最初设计是让成员成为虚拟属性。这意味着它们没有保存在 Enum
class 字典中,这意味着每次可能的查找都必须首先失败,然后 __getattr__
将在 class 和找到成员。
所以基本上工作很忙。
解决方法是尽可能将成员放入 class 字典中(大多数情况下是这样)。