Python:使用列表值添加到字典的最佳方式

时间:2012-06-20 11:57:15

标签: python dictionary

我正在构建一个类,其中包括带有整数键和列表值的字典。为这个字典添加值似乎是一个真正的瓶颈,我想知道是否有某种方法来加速我的代码。

class myClass():

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

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

这真的是最佳方式吗?我并不真正关心值的顺序,所以也许有一个更合适的数据结构,有更快的附加。然后,'append'似乎不是主要问题,因为如果我只是附加到一个空列表,代码会快得多。我想这是以前存储的列表的加载占用了大部分时间?


我发现问题不在dict中,但在列表中附加(虽然我在原帖中另有说法,我为此道歉)。这个问题是由于Python的垃圾收集器中的一个错误,在this other question上有很好的解释。在添加所有值然后重新启用它之前禁用gc会极大地加速这个过程!

3 个答案:

答案 0 :(得分:2)

将其与此相比:

class myClass():

  def __init__(self):
    self.d = {}

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

答案 1 :(得分:1)

他们说“请求宽恕比获得许可更好”。现在你不是亲自要求许可,但我想也许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,并对其进行操作。

是否更快?

答案 2 :(得分:0)

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