【问题标题】:dict.__getitem__ performance with stringsdict.__getitem__ 性能与字符串
【发布时间】:2011-06-08 00:58:54
【问题描述】:

我正在使用dict 将缓存路径存储在我已实现的文件系统中。 dict 中的键都是字符串。经过一些分析后,我证明字典中的查找是一个瓶颈。我的理解是dict 是高度优化的。不幸的是,cProfile 的精度不包括 dict 查找代码的内部工作原理。

在 Python 3 中查找字符串会如此缓慢是否有某些原因? 有什么办法可以解决或提高性能吗?

【问题讨论】:

  • python dict 应该是散列和恒定时间。没有改变数据表示,我真的想不出任何东西。你能以某种方式标记字符串以减少它们的长度或将它们变成纯数字吗?本地人也比全局人快大约 x2,这是在函数还是全局代码中?
  • @gecko,这是在 instancemethods 中完成的
  • 在 Python 3 中使用字符串键进行字典查找比在 Python 2 中慢一点,但不足以将非瓶颈变为瓶颈。所以这里的 Python 3 不是问题。您需要显示一些代码。
  • 他确实说这是一个文件系统,如果他的意思是“操作系统的一部分”,我认为 Python 不会是首选语言 :-) 它可能太慢了。但是,是的,更多信息会很好。

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


【解决方案1】:

我认为,有必要评估源代码以了解差异所在。最近我尝试将 Python2 代码移植到 Python3,但查找时间也很差,Python2 比 Python3 快约 30%。这不是实际代码,而是一个虚拟类,用于找出问题实际出在哪里。示例代码:

"""
python3
"""
from time import time
from random import randint

class Wooaah:

    def __init__(self):
        self.length=100000
        self.a=dict()
        self.b=dict()
        self.count=int()
        self.s=float()
        self.e=float()

    def dummy_data(self):
        for i in range(self.length):
            self.a[i]=time()
            self.b[i]=time()

    def setod(self):
        self.s=time()
        for i in self.a:
            if self.b.get(i):
                self.count+=1
        self.e=time()

a=Wooaah()
a.dummy_data()
a.setod()
print(a.count)
print(a.e-a.s)

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 2011-12-14
    • 2022-01-20
    • 2015-05-17
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    相关资源
    最近更新 更多