gpt4 book ai didi

python - 检查字典中的成员资格与 python 中的集合

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:02 24 4
gpt4 key购买 nike

似乎检查 dict keys as set 有点快:

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 的性能稍微好一些。在较大的数据结构大小下,内部实现细节开始主导差异,并且在我的机器上 set 往往表现得更好。

现实情况是,在大多数情况下,delta 并不重要。如果您真的想要更好的查找性能,请考虑使用 cythonctypes 转向 C 级操作,或者使用专为更大数据大小设计的库实现。当元素数超过几百万时,Python 基本类型并不意味着性能。

>>> # With empty dict as setup in question
>>> time('for i in xrange(length): check = i in d')
2.83035111427
>>> time('for i in xrange(length): check = i in s')
2.87069892883
>>> d = { random.random(): None for _ in xrange(100000) }
>>> s = set(d)
>>> time('for i in xrange(length): check = i in d')
3.84766697884
>>> time('for i in xrange(length): check = i in s')
3.97955989838
>>> d = { random.randint(0, 1000000000): None for _ in xrange(100000) }
>>> s = set(d)
>>> time('for i in xrange(length): check = i in d')
3.96871709824
>>> time('for i in xrange(length): check = i in s')
3.62110710144
>>> d = { random.randint(0, 1000000000): None for _ in xrange(10000000) }
>>> s = set(d)
>>> time('for i in xrange(length): check = i in d')
10.6934559345
>>> time('for i in xrange(length): check = i in s')
5.7491569519

关于python - 检查字典中的成员资格与 python 中的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40368011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com