我试图决定哪种数据结构最符合我的需求。
除了技术细节之外,我可以将我的程序的需求转换为使用词典或使用列表,并且由于性能将是一个问题,我想知道什么是更快的解决方案。我最终得出结论,检索/索引将是关键操作。
那么在内存使用和速度方面哪些更有效?
答案 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提供您正在寻找的所有信息