在Python中查找快速默认别名

时间:2010-01-24 13:31:13

标签: python

对于更大的dicts,是否有更快的方法来执行以下操作?

aliases = {
            'United States': 'USA',
            'United Kingdom': 'UK',
            'Russia': 'RUS',
          }
if countryname in aliases: countryname = aliases[countryname]

4 个答案:

答案 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进行真正的优化。

(如果您只处理国家/地区名称,那么我认为您不会处理大到足以保证我的任何建议的映射),但如果您正在考虑进行某种拼写检查实现,那么..

祝你好运。