命名dict键以便在python中快速查找

时间:2011-06-15 13:22:30

标签: python django performance dictionary

我将要有一个小字典(5到20个键之间),在python 2.5中一个页面加载将被引用多达一百次。

我开始命名它将要查找的键,我想知道是否有一个关键的命名约定我可以遵循以帮助dict查找时间。

5 个答案:

答案 0 :(得分:8)

我必须测试; - )

使用

  • f1,整数键1
  • f2短字符串,"one"
  • f3 long string "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

作为长度为4的字典的键之一。迭代10,000,000次并测量时间。我得到了这个结果:

<function f1 at 0xb779187c>
f1 3.64
<function f2 at 0xb7791bfc>
f2 3.48
<function f3 at 0xb7791bc4>
f3 3.65

我没有区别......

我的code

答案 1 :(得分:6)

可能是他们的合理名称,恰好会产生哈希没有冲突的名字。然而,CPython dicts已经是已知宇宙中最优化的数据结构之一,对于大多数输入产生很少的冲突,与其他内置类型的哈希方案很好地协作,非常快速地解决冲突等。它非常 任何的好处,特别是因为一百次查找并不是那么多。

例如,在我的4年台式机上运行这个timeit基准测试(运行一个可笑的低预算双核CPU,3.1 GHz):

...>python -mtimeit --setup="d = {chr(i)*100: i for i in range(15)};\
k = chr(7)*100" "d[k]"

1000000 loops, best of 3: 0.222 usec per loop

这些字符串比手动输入变量名远程敏感的所有字符串大十倍。将长度从100减少到10会导致每次查找 0.0778微秒。现在测量页面的加载速度并比较它们(或者,只是思考在构建页面时你实际完成的工作需要多长时间);并考虑缓存,框架开销和所有这些事情。

在这方面你所做的一切都无法在性能方面,时期,完全停止方面发挥作用。

答案 2 :(得分:2)

因为Python字符串哈希函数遍历字符(至少如果this仍适用),我会选择 short 字符串。

答案 3 :(得分:1)

添加另一个方面:

对于非常小的词典和繁重的时间限制,计算哈希值的时间可能是整个时间的一个重要部分。因此,对于(比方说)5个元素,使用数组和顺序搜索(当然,包含在一些MiniDictionary对象中)可能更快,甚至可能通过二进制搜索来增强。这可能会找到具有2-3个比较的元素,这可能比也可能不比哈希计算加一个比较更快。

收支平衡取决于哈希速度,平均元素数量和预期的哈希冲突数量,因此需要进行一些测量,并且没有“一刀切”的答案。

答案 4 :(得分:0)

Python字典有一个快速的字符串键路径,所以使用这些(而不是像元组)。字符串的哈希值缓存在该字符串中,因此字符串保持与实际值相同的更重要;字符串常量(即在程序中逐字显示并且不是计算结果的字符串)始终保持完全相同,因此只要您使用它们,就不必担心。