我正在修补 Pythonset
和frozenset
集合类型。
最初,我认为它frozenset
会提供比 更好的查找性能set
,因为它是不可变的,因此可以利用存储项目的结构。
但是,对于以下实验,情况似乎并非如此:
import random
import time
import sys
def main(n):
numbers = []
for _ in xrange(n):
numbers.append(random.randint(0, sys.maxint))
set_ = set(numbers)
frozenset_ = frozenset(set_)
start = time.time()
for number in numbers:
number in set_
set_duration = time.time() - start
start = time.time()
for number in numbers:
number in frozenset_
frozenset_duration = time.time() - start
print "set : %.3f" % set_duration
print "frozenset: %.3f" % frozenset_duration
if __name__ == "__main__":
n = int(sys.argv[1])
main(n)
我使用 CPython 和 PyPy 执行了这段代码,结果如下:
> pypy set.py 100000000
set : 6.156
frozenset: 6.166
> python set.py 100000000
set : 16.824
frozenset: 17.248
frozenset
在 CPython 和 PyPy 中,查找性能似乎实际上更慢。有人知道为什么会这样吗?我没有研究实现。