我正在构建一个类,其中包括带有整数键和列表值的字典。为这个字典添加值似乎是一个真正的瓶颈,我想知道是否有某种方法来加速我的代码。
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会极大地加速这个过程!
答案 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)
作为结论,我可以说原始问题中的代码比所有其他建议更快或更快。