什么是最快的?这取决于您需要使用它的次数,以及是否能够从一开始就创建索引字典。
正如其他人所提到的,一旦拥有它,字典就会快得多,但将列表转换为字典会代价高昂。我将要展示我在计算机上获得的内容,以便我可以比较数字。下面是我的了:
>>> import timeit
>>> timeit.timeit('mydict = {val[0]:(ind, val[1]) for ind, val in enumerate(mylist)}', 'mylist = [(i, "a") for i in range(1000)]')
200.36049539601527
出人意料的是,这是显著比它慢甚至创造摆在首位名单:
>>> timeit.timeit('mylist = [(i, "a") for i in range(1000)]')
70.15259253453814
那么,如何与此相比,在事先创建字典地点?
>>> timeit.timeit('mydict = {i:("a", i) for i in range(1000)}')
90.78464277950229
显然,这并不总是可能的,因为你并不总是一个创建列表,但我想这包括用于比较。
初始化摘要:
- 创建列表 - 70.15
- 创建字典 - 90.78
- 索引现有列表 - 70.15 + 200.36 = 270.51
所以现在,假设你有一个列表或字典已经建立,需要多长时间?
>>> timeit.timeit('[i[0] for i in mylist].index(random.randint(0,999))', 'import random; mylist = [(i, "a") for i in range(1000)]')
68.15473008213394
然而,这将创建一个新的临时列表中的每个时间,所以让我们来看看击穿
>>> timeit.timeit('indexed = [i[0] for i in mylist]', 'import random; mylist = [(i, "a") for i in range(1000)];')
55.86422327528999
>>> timeit.timeit('indexed.index(random.randint(0,999))', 'import random; mylist = [(i, "a") for i in range(1000)]; indexed = [i[0] for i in mylist]')
12.302146224677017
55.86 + 12.30 = 68.16,这与68.15之前的结果给了我们一致的。现在,词典:
>>> timeit.timeit('mydict[random.randint(0,999)]', 'import random; mylist = [(i, "a") for i in range(1000)]; mydict = {val[0]:(ind, val[1]) for ind, val in enumerate(mylist)}')
1.5201382921450204
当然,在每一种情况下我使用random.randint
让我们的时间,要因素出来:
>>> timeit.timeit('random.randint(0,999)', 'import random')
1.4206546251180043
所以现在使用索引摘要:
- 使用列表 - (68.16-1.42)= 66.74第一次,(12.30-1.42)= 10.88之后
- 使用词典 - (1.52-1.42)= 0.10,每次
现在让我们弄清楚为使字典变得更有用,需要多少次访问。首先,对于时间的公式作为访问次数的一个函数:
- 列表 - 55.86 + 10.88x
- 词典 - 200.36 + 0.10x
- 初始词典 - 20.63 + 0.10x
基于这些公式,如果您需要至少访问14次字典,字典会变得更快。如果你可以从开始而不是列表创建一个字典,那么创建一个字典而不是一个列表的额外开销就会超过开销的偏移量来创建一个只包含元组中第一个值的列表。
那么哪个最快?这取决于您需要使用它的次数,以及是否能够从一开始就创建索引字典。
注意:我正在使用Python 2.7.5。 Python 3.x中的计时可能非常不同,并且在不同的机器上也可能会有所不同。我很想知道别人会在他们的机器上拿出什么。
所有时间都在几秒钟内,但计时为一百万次。因此,单个运行几微秒内的数字是相同的。
timeit模块对此很有用:http://docs.python.org/2/library/timeit.html –