为什么list + set方法使列表比字典键方法更快?

时间:2014-06-27 08:12:44

标签: python timeit

以下是同一时间试验的样本:

>>> import timeit
>>> setup = """
... from random import randint
... rand_list = [randint(0,10) for i in range(0,10000)]
... """

>>> timeit.Timer('list(set(rand_list))', setup=setup).repeat(5, 1000)
[0.17256593704223633, 0.17117094993591309, 0.17115998268127441, 0.17191100120544434, 0.17226791381835938]
>>> timeit.Timer('{ x:True for x in rand_list}.keys()', setup=setup).repeat(5, 1000)
[0.4490840435028076, 0.44455599784851074, 0.442918062210083, 0.4430229663848877, 0.44559407234191895]

正如您所看到的,列表(set(MY_LIST))方法比字典方法快约2.5倍,对于较小的列表或较大的列表,结果类似。

任何人都可以解释为什么会这样,即在时间复杂度方面执行这两个步骤的功能有何不同?

1 个答案:

答案 0 :(得分:4)

在第二次测试中,你正在字典理解中运行一个超过10000项的Python循环;正是这个循环减慢了它。

您可以尝试使用dict.fromkeys()

dict.fromkeys(rand_list).keys()

这会根据rand_list值创建一个字典,并将所有值设置为None

现在只有稍微慢:

>>> import timeit
>>> from random import randint
>>> rand_list = [randint(0,10) for i in range(0,10000)]
>>> timeit.Timer('list(set(rand_list))', setup='from __main__ import rand_list').repeat(5, 1000)
[0.1437511444091797, 0.13837504386901855, 0.13841795921325684, 0.1395130157470703, 0.1474599838256836]
>>> timeit.Timer('dict.fromkeys(rand_list).keys()', setup='from __main__ import rand_list').repeat(5, 1000)
[0.18216991424560547, 0.17930316925048828, 0.18064308166503906, 0.17971301078796387, 0.17820501327514648]

这是预期的;跟踪键和值时,dict()稍微多一些工作,而不是只是集合中的键。