【问题标题】:Python: optimal way of adding to dictionary with list valuesPython:使用列表值添加到字典的最佳方式
【发布时间】:2012-06-22 13:22:44
【问题描述】:

我正在构建一个类,其中包含一个带有整数键和列表值的字典。不过,向该字典添加值似乎是一个真正的瓶颈,我想知道是否有某种方法可以加快我的代码速度。

class myClass():

  def __init__(self):
    self.d = defaultdict(list)

  def addValue(self, index, value):
    self.d[index].append(value)

这真的是这样做的最佳方式吗?我并不真正关心值的顺序,所以也许有一个更合适的数据结构可以更快地追加。再说一次,“附加”似乎不是主要问题,因为如果我只是附加到一个空列表,代码会快很多。我猜是加载之前存储的列表占用了大部分时间?


我发现问题不在字典中,而是在列表附加中(尽管我在原始帖子中另有声明,对此我深表歉意)。这个问题是由于 Python 的垃圾收集器中的一个错误造成的,this other question 对此进行了很好的解释。在添加所有值之前禁用 gc 然后重新启用它,极大地加快了进程!

【问题讨论】:

  • 将项目添加到列表并从对象或字典中获取值都不需要时间。要加快程序速度,您可以通过分析而不是通过更改随机代码段来发现瓶颈。
  • 将项目映射到现有键是否比向新键添加值要快得多?
  • 我刚刚发现问题不在字典中,而是在列表附加中(尽管我在原始帖子中另有声明,对此我深表歉意)。然后我在stackoverflow.com/questions/2473783/… 上找到了我的问题的答案。由于我是这个网站的新手,我不知道在这种情况下标准程序是什么:我应该删除我的原始帖子吗?或者在帖子中添加上述详细信息和答案?

标签: python dictionary


【解决方案1】:

作为结论,我可以说我在原始问题中的代码比所有其他建议更快或一样快。

【讨论】:

    【解决方案2】:

    他们说“请求宽恕比请求许可要好。”。现在您并没有亲自请求许可,但我认为 defaultdict 可能会这样做,这就是减慢速度的原因。

    try这个:

    class myClass():
    
      def __init__(self):
        self.d = {}
    
      def addValue(self, index, value):
        try:
            self.d[index].append(value)
        except KeyError:
            self.d[index] = [value]
    

    这会尝试访问字典中的index 键,如果它不存在,它将引发KeyError,并对其进行操作。

    是不是更快了?

    【讨论】:

    • 我尝试比较您的代码和问题代码(使用timeit)。我用过这个测试:my = myClass() my.addValue(3, "ab") my.addValue(3, "cd") my.addValue(4, "ef") my.addValue(4, "gh") 原始代码更快!在我的机器上 24.66 usec 用于您的代码,18.10 usec 用于问题代码。所以看起来这种方法不是答案..
    • 看来你有最快的解决方案然后:)
    【解决方案3】:

    对比一下:

    class myClass():
    
      def __init__(self):
        self.d = {}
    
      def addValue(self, index, value):
        self.d.setdefault(index, []).append(value)
    

    【讨论】:

    • 出于好奇,为什么这样更快?我原以为defaultdict 在幕后做了非常相似的事情。
    • 经过短暂的测试,我发现这并没有更快。我只是更喜欢它。
    • 我认为它实际上在幕后做同样的事情;在任何情况下,时间都是相似的......不过我更喜欢 defaultdict,因为通常你必须输入更少。
    猜你喜欢
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2010-11-21
    • 2011-04-28
    相关资源
    最近更新 更多