为什么字典比Python中的列表更快?

时间:2016-10-02 02:57:30

标签: python dictionary

>>> timeit.timeit('test.append("test")', setup='test = []')
0.09363977164165221
>>> timeit.timeit('test[0] = ("test")', setup='test = {}')
0.04957961010914147

我甚至尝试了一个循环,同样的事情:

>>> timeit.timeit('for i in range(10): test.append(i)', setup='test = []')
1.3737744340367612
>>> timeit.timeit('for i in range(10): test[i] = i', setup='test = {}')
0.8633718070233272

为什么列表会变慢?

1 个答案:

答案 0 :(得分:4)

首先,list.appenddict.__setitem__都是O(1)平均情况。当然他们会有不同的系数,但实际上没有任何理由说一个或另一个会更快。系数也可能根据实施细节而变化。

其次,更公平的比较是删除属性解析开销:

>>> timeit.timeit('test[0] = ("test")', setup='test = {}')
0.0813908576965332
>>> timeit.timeit('test_append("test")', setup='test = []; test_append = test.append')
0.06907820701599121

当您查看非常便宜的操作(例如append)时,在实例上查找方法名称相对昂贵。

一旦内部有一些数据,我也会看到列表持续快一点。这个例子是python 3.5.2:

>>> dict_setup = 'import random; test = {random.random(): None for _ in range(1000)}'
>>> list_setup = 'import random; test = [random.random() for _ in range(1000)]; test_append=test.append'
>>> timeit.timeit('test[0] = "test"', setup=dict_setup)
0.06155529400166415
>>> timeit.timeit('test_append("test")', setup=list_setup)
0.057089386998995906