5

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

class myClass():

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

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

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


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

4

3 回答 3

2

将其与此进行比较:

class myClass():

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

  def addValue(self, index, value):
    self.d.setdefault(index, []).append(value)
于 2012-06-20T12:00:01.533 回答
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字典中的键,如果它不存在,它将引发 aKeyError并对其进行操作。

是不是更快了?

于 2012-06-20T12:22:25.540 回答
0

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

于 2014-02-06T08:28:15.547 回答