【问题标题】:Finding fast default aliases in Python在 Python 中快速查找默认别名
【发布时间】:2010-01-24 13:31:12
【问题描述】:

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

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

【问题讨论】:

    标签: python


    【解决方案1】:

    您的解决方案很好,因为字典的“in”是 0(1)。

    你可以做这样的事情来节省一些打字:

    countryname = aliases.get(countryname, countryname)
    

    (但我发现你的代码比那更容易阅读)

    在速度方面,最佳解决方案取决于是否会出现大多数“命中”或“未命中”。但就差异而言,这可能在纳秒范围内。

    【讨论】:

    • 由于零件标注速度取决于命中或未命中的数量而有所提高
    【解决方案2】:

    如果您的列表适合内存,则 dicts 是最快的方法。正如 S.Mark 指出的那样,您正在做两个查找,其中一个会做:

    countryname = aliases.get(countryname, countryname)
    

    (如果国家/地区名称不在字典中,则保持不变),或者:

    try:
        countryname = aliases[countryname]
    except KeyError:
        pass
    

    【讨论】:

      【解决方案3】:

      使用 .get 访问可能比检查和分配变量更快

      aliases.get(countryname)
      

      如果别名中不存在 countryname,它将返回 None。

      【讨论】:

      • .get() 可以被赋予一个默认参数,因此aliases.get(countryname, countryname) 将解决“将返回无”问题。
      【解决方案4】:

      如果您的字典非常大,并且您希望您的许多检查都找不到匹配项,那么您可能需要考虑 Bloom filter 或其派生词之一并允许误报。

      另外,由于您的键可以排序(和/或具有派生值),您可以实现 bisection 或其他 root-finding 算法。

      首先,我要弄清楚 Python 是如何实现字典查找的,所以你不只是重新发明轮子。

      此外,如果涉及大量迭代,这些的纯 Python 实现可能会非常慢。考虑使用 Cython、Numpy 或 F2Py 以获得真正的优化。

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

      祝你好运。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-15
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多