2012-06-20 60 views
5

我正在建立一个包含整数键和列表值的字典。为这本字典增加值似乎是一个真正的瓶颈,但我想知道是否有某种方法可以加速我的代码。Python:使用列表值添加到字典的最佳方式

class myClass(): 

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

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

这真的是这样做的最佳方式?我并不关心值的顺序,所以也许有一个更合适的数据结构,并有更快的附加值。然后,'追加'似乎不是主要问题,因为如果我简单地追加到一个空列表中,代码要快得多。我猜这是以前存储的列表大部分时间的加载?


我发现,这个问题是不是在快译通,但列表中的append(虽然我在原来的职位,对此我表示歉意另有要求)。这个问题是由于Python的垃圾收集器中的一个错误引起的,在this other question上有很好的解释。在添加所有值然后重新启用它之前禁用gc,将极大地加速该过程!

+2

将项目添加到列表并获取对象或字典中的值都是不花时间的。为了加速程序,您可以通过分析找到瓶颈,而不是通过更改随机代码段。 –

+0

将项目映射到现有密钥的速度明显快于将值添加到新密钥? –

+0

我刚刚发现问题不在字典中,但在列表中追加(尽管我在原始文章中声明了其他内容,对此我表示歉意)。然后我在http://stackoverflow.com/questions/2473783/is-there-a-way-to-circumvent-python-list-append-becoming-progressively-slower上找到了我的问题的答案。由于我是这个网站的新手,在这种情况下,我不知道标准程序是什么:我应该删除原始文章吗?或者添加上面的细节并回复帖子? – niefpaarschoenen

回答

0

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

2

比较它这样的:

class myClass(): 

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

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

出于好奇,为什么这会更快?我曾认为'defaultdict'在幕后非常相似。 –

+1

经过短暂的测试,我发现这不是更快。我只是喜欢它。 – eumiro

+0

我认为它幕后实际上是一样的;时间在任何情况下都是相似的......但我更喜欢defaultdict,因为一般来说你必须输入less。 – niefpaarschoenen

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,并在采取行动。

它更快吗?

+0

我试图比较你的代码和代码(使用[timeit](http://docs.python.org/library/timeit.html))。 my.addValue(3,“cd”) my.addValue(4,“ef”) my.addValue(3,“ab”) my.addValue (4,“gh”)'原始代码更快!在我的机器上24.66 usec代码和18.10 usec代码问题。所以看起来这种方法不是答案。 – stalk

+1

似乎你有最快的解决方案:) – jadkik94