对于更大的dicts,是否有更快的方法来执行以下操作?
aliases = {
'United States': 'USA',
'United Kingdom': 'UK',
'Russia': 'RUS',
}
if countryname in aliases: countryname = aliases[countryname]
答案 0 :(得分:6)
您的解决方案很好,因为“in”对于词典来说是0(1)。
你可以做这样的事情来节省一些打字:
countryname = aliases.get(countryname, countryname)
(但我发现你的代码比那更容易阅读)
谈到速度,最好的解决方案取决于是否会出现大多数“点击”或“未命中”。但是,当涉及差异时,这可能会在纳秒范围内。
答案 1 :(得分:2)
如果您的列表适合内存,那么dicts是最快的方式。正如S.Mark指出的那样,你正在进行两次查找,其中包括:
countryname = aliases.get(countryname, countryname)
(如果不在字典中,将保留countryname不变),或者:
try:
countryname = aliases[countryname]
except KeyError:
pass
答案 2 :(得分:1)
使用.get访问可能比检查和分配变量
更快aliases.get(countryname)
如果别名中不存在countryname,则返回None。
答案 3 :(得分:0)
如果您的字典非常大并且您希望许多支票找不到匹配项,那么您可能需要考虑Bloom filter或其中一个衍生产品并允许误报。
或者,因为您的密钥可以排序(和/或具有派生值),您可以实现bisection或其他root-finding算法。
首先,我会弄清楚Python究竟是如何实现字典查找的,所以你不仅仅是在重新发明轮子。
此外,如果涉及大量迭代,那么这些的纯Python实现可能会非常慢。考虑使用Cython,Numpy或F2Py进行真正的优化。
(如果您只处理国家/地区名称,那么我认为您不会处理大到足以保证我的任何建议的映射),但如果您正在考虑进行某种拼写检查实现,那么..
祝你好运。