a.index(x)
本身将作为O(n)
名单必须被搜索的值x
。整体运行时间为O(n^2)
。
“保存”函数调用并不是一个坏的算法比一个好的算法更快。
更高效(O(n)
)很可能是:
result = []
seen = set()
for i in a:
if i not in seen:
result.append(i)
seen.add(i)
看一看这个问题:How do you remove duplicates from a list in whilst preserving order?
(顶端回答还说明了如何在一个列表理解的方式,这样做哪些将比明确的循环更有效)
你可以很容易地profil使用timeit
[docs]模块自己编写代码。例如,我把你的代码放在func1
和我的func2
中。如果我有一个数组重复这个1000
次1000
元素(无重复):
>>> a = range(1000)
>>> timeit.timeit('func1(a)', 'from __main__ import func1, a', number=1000)
11.691882133483887
>>> timeit.timeit('func2(a)', 'from __main__ import func2, a', number=1000)
0.3130321502685547
现在有了副本(只有100个不同的值):
>>> a = [random.randint(0, 99) for _ in range(1000)]
>>> timeit.timeit('func1(a)', 'from __main__ import func1, a', number=1000)
2.5020430088043213
>>> timeit.timeit('func2(a)', 'from __main__ import func2, a', number=1000)
0.08332705497741699
如果他们留,真的很要紧有序?如果他们不得不,那么你的计算成本会很高。如果您可以放弃订购,只需将物品放入一个集合中,然后将其放回列表中。 –