python字典中long(str)键的效率

Igo*_*gor 6 python dictionary key

我正在解析一些xml(带有一些python 3.4代码),并希望从节点及其id属性中检索文本.示例: <li id="12345"> Some text here </li> 我当前的代码仅围绕文本构建(我现在正在添加id,但之前不需要这个).我循环浏览一个文本/句子列表,然后继续做一些事情.所以我想创建一个以文本/句子为键的字典,并将此id属性作为值.

但是,这感觉效率不高.文本可以是整个段落,使得密钥很长.而id总是相当有限的长度(但仍然是str类型,例如一些字母字符后跟一些数字).但是,使id成为键,文本值需要对代码进行一些重写.所有这些都不是很有问题,但这让我感到疑惑:将文本(可能是整个段落)作为关键字,与像"ulp_887362487687678"这样的ID相比,效率是多么低效?

我可以制作两个反向词典(一个以id作为键,另一个以text作为键)并比较构造和查找以及所有.我还发现了一些关于密钥长度限制的主题(Do Dictionaries有密钥长度限制吗?).但我只是想知道你对此有何看法.在你的词典中有这么长的str键你肯定想要避免,或者这不是一个大问题?如果你可以分享一些专业人士/骗子,那就太好了!

Mar*_*ers 11

不,Python字符串长度几乎不会对字典性能产生影响.字符串长度可能具有的唯一影响是使用的hash()函数将键映射到散列表槽.

字符串长度对性能的影响非常小hash():

>>> import random
>>> from timeit import timeit
>>> from string import ascii_letters
>>> generate_text = lambda len: ''.join([random.choice(ascii_letters) for _ in xrange(len)])
>>> for i in range(8):
...     length = 10 + 10 ** i
...     testword = generate_text(length)
...     timing = timeit('hash(t)', 'from __main__ import testword as t')
...     print 'Length: {}, timing: {}'.format(length, timing)
... 
Length: 11, timing: 0.061537027359
Length: 20, timing: 0.0796310901642
Length: 110, timing: 0.0631730556488
Length: 1010, timing: 0.0606122016907
Length: 10010, timing: 0.0613977909088
Length: 100010, timing: 0.0607581138611
Length: 1000010, timing: 0.0672461986542
Length: 10000010, timing: 0.080118894577
Run Code Online (Sandbox Code Playgroud)

我停止生成一个1000万字符的字符串,因为我无法等待我的笔记本电脑生成一个1亿字符串.

时间非常不变,因为一旦计算出值,该值实际上会缓存在字符串对象上.