字典检索或列表索引的速度更快?

时间:2016-08-28 14:44:45

标签: python list dictionary profiling

我试图决定哪种数据结构最符合我的需求。

除了技术细节之外,我可以将我的程序的需求转换为使用词典或使用列表,并且由于性能将是一个问题,我想知道什么是更快的解决方案。我最终得出结论,检索/索引将是关键操作。

那么在内存使用和速度方面哪些更有效?

3 个答案:

答案 0 :(得分:1)

如果您不需要搜索,请使用列表。它比一个字典更快,使用更少的RAM。对于小型集合(< 100项),速度差异很小,但对于大型集合,dict将减慢约20%。它肯定会使用更多的RAM。

这是一些timeit代码,用于比较list与dict的访问速度。它还显示了集合对象本身消耗的RAM(但不包括它们所持有的数据对象的RAM)。

#!/usr/bin/env python3

''' Compare list vs dict access speed 

    See http://stackoverflow.com/q/39192442/4014959

    Written by PM 2Ring 2016.08.29
'''

from sys import getsizeof
from timeit import Timer

commands = {'dict' : 'for i in r:d[i]', 'list' : 'for i in r:a[i]'}

def time_test(loops, reps):
    timings = []
    setup = 'from __main__ import r, a, d'
    for name, cmd in commands.items():
        result = Timer(cmd, setup).repeat(reps, loops)
        result.sort()
        timings.append((result, name))

    timings.sort()
    for result, name in timings:
        print(name, result)

    #Find the ratio of slowest / fastest
    tlo, thi = [timings[i][0][0] for i in (0, -1)]
    print('ratio: {0:f}\n'.format(thi / tlo))

num = 2000
r = range(num)
a = list(r)
d = {i:i for i in r}

fmt = 'Sizes: num={}, list={}, dict={}'
print(fmt.format(num, getsizeof(a), getsizeof(d)))

loops, reps = 2000, 3
time_test(loops, reps)

<强>输出

Sizes: num=2000, list=9056, dict=49200
list [1.2624831110006198, 1.3356713940011105, 1.406396518003021]
dict [1.506095960001403, 1.525646976999269, 1.5623748449979757]
ratio: 1.192963

速度差异实际上高于那些结果中显示的速度差异,因为从r范围对象检索整数所花费的时间与执行列表所需的时间大致相同。 dict访问。您可以通过在commands词典中添加这样的条目来衡量:

'none': 'for i in r:i'

答案 1 :(得分:0)

好吧,从dict中检索与从列表中检索具有相同的复杂性:

_dict[1]
_list[1]

但......,有了dicts,你可以使用:

_dict.get(1, 'something else')

它只会返回其他内容&#39;如果没有密钥1。使用列表,你不能这样做。您只想获得按编号1编制索引的项目。如果您要求列表外的项目,那么索引将高于您的列表长度,那么您的程序将引发必须处理的IndexError。接下来的问题是你必须知道该列表的大小,所以你需要先检查它。

答案 2 :(得分:-1)

https://wiki.python.org/moin/TimeComplexity提供您正在寻找的所有信息