【发布时间】:2012-06-22 18:38:19
【问题描述】:
在这个page,我看到了一些有趣的东西:
请注意,(在实践中)只处理 str 键的 dicts 有一条快速路径;这不会影响算法的复杂性,但会显着影响常数因素:典型程序完成的速度。
那到底是什么意思呢?
这是否意味着使用字符串作为键总是更快?
如果是,为什么?
更新:
感谢关于优化的建议!但实际上我更感兴趣的是显而易见的事实,而不是我们是否应该或何时应该进行优化。
更新 2:
感谢您的精彩回答,我将在此处引用@DaveWebb 提供的link 中的内容:
" ...
ma_lookup 最初设置为 lookdict_string 函数(在 3.0 中重命名为 lookdict_unicode),它假定字典中的键和正在搜索的键是标准的 PyStringObject。然后它可以进行一些优化,例如减轻各种错误检查,因为字符串到字符串的比较不会引发异常。也不需要富对象比较,这意味着我们避免调用 PyObject_RichCompareBool,而总是直接使用 _PyString_Eq。
... "
另外,对于实验数字,我认为如果没有int到字符串的转换,差异的大小会更大
【问题讨论】:
-
我猜这一切都归结为关键对象的
__hash__方法有多快。我猜对字符串进行哈希处理相当简单,但我会对字典查找的多少比例用于哈希处理非常感兴趣。 -
您的更新不会改变任何东西。不,在大多数情况下它不会更快,除非您的键首先是字符串。
-
@Lattyware 链接页面似乎意味着速度的提高每次查找不仅仅是为了构建。
-
@Wilduck 我不是在谈论建筑。如果您的键一开始不是字符串,那么每次您需要进行查找时,您都需要将您的键转换为字符串。 (除非你用字典做一些琐碎的事情)。
-
@Lattyware 啊,我明白了。虽然我仍然可以想象一些情况,您可以从字符串的前期转换中获得改进。
标签: python