【问题标题】:how to intern dictionary string keys in python?如何在python中实习字典字符串键?
【发布时间】:2019-09-21 20:28:43
【问题描述】:

阅读该实习字符串后可以帮助提高性能。我是否只是将 sys.intern 调用的返回值存储在字典中作为键,就是这样?

t = {}
t[sys.intern('key')] = 'val'

谢谢

【问题讨论】:

  • 为什么您认为在没有实习的情况下使用字典是性能问题?你衡量了什么迫使你优化这个特殊的瓶颈?
  • 所以我将添加我的用例,我将 ipv4 地址作为键存储在字典中,然后我想检查 ip 地址是否在字典中。我希望我可以加快这一步,每一点都有帮助,而且我想了解它。

标签: python python-3.x string performance dictionary


【解决方案1】:

是的,这就是你将如何使用它。

为了更具体地说明性能,the doc 表示:

Interning 字符串对于在字典查找中获得一点性能很有用——如果字典中的键是 intern 的,并且查找键是 inned,则键比较(散列后)可以通过指针比较而不是字符串来完成比较。

(经典)dict 查找有两个步骤: 1. 将对象散列成一个数字,该数字是存储数据的数组中的索引; 2. 遍历该索引处的数组单元格以找到具有正确键的一对 (key, value)。

通常,第二步相当快,因为​​我们选择了一个哈希函数来确保很少发生冲突(不同的对象 - 相同的哈希)。但它仍然需要根据每个存储的具有相同散列的密钥来检查您要查找的密钥。这是更快的第 2 步:在对字符串相等性进行昂贵的逐字符测试之前测试字符串身份。

第 1 步更难加速,因为您可以将哈希值与内部字符串一起存储...但您必须计算哈希值才能找到内部字符串本身。

这是理论!如果您确实需要提高性能,请先进行一些基准测试。

然后想想领域的特殊性。您将 IPv4 地址存储为密钥。 IPv4 地址是介于 0 和 256^4 之间的数字。如果您用整数替换人类友好的地址表示,您将获得更快的散列(在 CPython 中散列小数字,如果几乎没有成本:https://github.com/python/cpython/blob/master/Python/pyhash.c)和更快的查找。 ip_address module 可能是您的最佳选择。

如果您确定地址在边界之间(例如 172.16.0.0 – 172.31.255.255),您可以尝试使用数组而不是字典。除非您的阵列很大(磁盘交换),否则它应该会更快。

最后,如果这还不够快,请准备好使用更快的语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 2013-07-02
    • 2011-02-11
    相关资源
    最近更新 更多