【发布时间】:2017-03-15 01:27:44
【问题描述】:
似乎检查字典键的设置要快一点:
import random
import string
import timeit
repeat = 3
numbers = 1000
def time(statement, _setup=None):
print min(
timeit.Timer(statement, setup=_setup or setup).repeat(
repeat, numbers))
random.seed('slartibartfast')
# Integers
length = 100000
d = {}
for _ in range(length):
d[random.randint(0, 10000000)] = 0
s = set(d)
setup = """from __main__ import s, d, length
"""
time('for i in xrange(length): check = i in d')
time('for i in xrange(length): check = i in s')
# Strings
d = {}
for _ in range(length):
d[''.join(random.choice(string.ascii_uppercase) for __ in range(16))] = 0
s = set(d)
test_strings= []
for _ in range(length):
test_strings.append(random.choice(string.ascii_uppercase) for __ in range(16))
setup = """from __main__ import s, d, length, test_strings
"""
time('for i in test_strings: check = i in d')
time('for i in test_strings: check = i in s')
打印类似:
10.1242966769
9.73939713014
10.5156763102
10.2767765061
这是意料之中的还是随机的神器?
想知道是否值得在性能密集型代码中为 dict 键创建集合。
编辑:我的测量结果确实让我对底层实现感到好奇,我并不是想节省微秒,我只是好奇 - 是的,如果事实证明底层实现真的有利于集合,我可以制作一组这些 dict 键 -与否(我实际上是在修补遗留代码)。
【问题讨论】:
-
如果性能如此关键,以至于毫秒之间的微小差异都会产生影响,那么 Python 可能是不适合使用的语言。我会追求可读性,而不是每 100,000 次迭代节省 0.2 秒。
-
@John 是的,这本身并不是一个性能问题——我对底层实现感到好奇——dict 查找是由集合实现的吗?好像没有
-
不,它们不是由集合实现的,但它们使用与集合相同的基本方法。也不能保证是这种情况,只有大 O 约束哦 O(1) 查找在合理条件下成立。
-
@Mr_and_Mrs_D 这是一个有趣的问题。没有多想,我的直觉是,在引擎盖下,集合是具有空值的字典,因此我猜想查找时间几乎是相同的。它似乎比这更复杂一些。
-
用字符串基准编辑
标签: python performance python-2.7 dictionary set