gpt4 book ai didi

python - 字典的高效键

转载 作者:行者123 更新时间:2023-11-28 18:09:13 25 4
gpt4 key购买 nike

我刚开始在这里发帖,所以我希望我能提供足够的细节。我试图找出键选择是否会影响 Python 中字典的效率。我想到的一些比较是:

  • 数字与字符串(例如 my_dict[20] 会比 my_dict['twenty'] 快)
  • len字符串(例如 my_dict['a'] 会比 my_dict['abcdefg'] 快)
  • 在字典中混合键类型,例如使用数字、字符串和/或元组(例如 my_dict = {0: 'zero', 2: 'two'} 会比 {0: 'zero', 'two': 2} 执行得更快)

我无法从谷歌搜索中找到这个主题,所以我想这里可能有人知道。

最佳答案

首先,我建议你了解How are Python's Built In Dictionaries Implemented .

现在,让我们做一个随机实验来证明这个理论(至少部分证明):

import timeit
import string
import random
import time


def random_str(N):
return ''.join(
random.choice(string.ascii_uppercase + string.digits) for _ in range(N)
)


def experiment1(dct, keys):
s = time.time()
{dct[k] for k in keys}
return time.time() - s


if __name__ == "__main__":
N = 10000
K = 200
S = 50000
dct1 = {random_str(K): None for k in range(N)}
dct2 = {i: None for i in range(N)}
keys1 = list(dct1.keys())
keys2 = list(dct2.keys())

samples1 = []
samples2 = []
for i in range(S):
samples1.append(experiment1(dct1, keys1))
samples2.append(experiment1(dct2, keys2))

print(sum(samples1), sum(samples2))

# print(
# timeit.timeit('{dct1[k] for k in keys1}', setup='from __main__ import dct1, keys1')
# )

# print(
# timeit.timeit('{dct2[k] for k in keys2}', setup='from __main__ import dct2, keys2')
# )

我在我的盒子上使用不同的采样大小得到的结果是:

  • N=10000,K=200,S=100 => 0.08300423622131348 0.07200479507446289
  • N=10000,K=200,S=1000 => 0.885051965713501 0.7120392322540283
  • N=10000,K=200,S=10000 => 8.88549256324768 7.005417346954346
  • N=10000,K=200,S=50000 => 43.57453536987305 34.82594871520996

所以正如你所看到的,无论你是使用大的随机字符串来查找字典还是整数,性能都几乎保持不变。您要考虑的唯一“真正”区别是两个词典的内存消耗。这在将大量字典转储到磁盘或从磁盘加载时可能是相关的,在这种情况下,拥有紧凑形式的数据结构可能是值得的,这样您就可以在缓存/读取它们时节省几秒钟。

NS:如果有人能够解释为什么我在使用 timeit(注释部分)时得到了很大的时间,请让我...用很少的实验常数我会得到非常高的值...这就是我离开它的原因未评论。如果您知道原因,请添加评论;D

关于python - 字典的高效键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51774445/

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