我很好奇哪种实现在确定两个列表中是否存在非相似元素方面会更快。在这里,两个列表的长度都相同,并且只有一个不相同的元素。
实施#1:
lista = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
listb = ['a', 'b', 'c', 'd', 'e', 'f', 'gslfkjsjf']
difference = list(set(lista) - set(listb))
>>> ['g']
实施#2:
lista = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
listb = ['a', 'b', 'c', 'd', 'e', 'f', 'gslfkjsjf']
for i in range(len(lista)):
if (lista[i] != listb[i]):
print(lista[i])
>>> g
我想知道最快的方法来比较两个相同长度的列表(大约2000个左右,其中每个元素都是唯一的字符串),所以我对知道答案很感兴趣。例)。感谢所有提前答复的人。
答案 0 :(得分:0)
这是如何通过实时ipython3 repl进行测量
from timeit import timeit # import timeit
# declare the lists
lista = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
listb = ['a', 'b', 'c', 'd', 'e', 'f', 'gslfkjsjf']
# measure
timeit('difference = list(set(lista) - set(listb))', globals=globals())
timeit('''for i in range(len(lista)):
if (lista[i] != listb[i]):
print(lista[i])''', globals=globals())
这里,循环的结果为4.551160663000701
,集合的结果为0.851781547000428
。请记住,默认情况下,timetime将运行1000000次。
现在为什么设置速度如此之快?集使用哈希算法代替索引。这意味着对于集合来说,loopkup的速度要快得多,因为不需要迭代就可以找到值。另外,for循环具有打印,范围和比较功能,不仅速度较慢,而且还在执行更多操作。
答案 1 :(得分:0)
根据此处https://wiki.python.org/moin/TimeComplexity的文档,在最佳情况下,s-t
的集合差取O(len(s))
。看https://stackoverflow.com/a/48044412/3236440。
因此,您的实现#1需要O(len(lista))
您的实施#2也需要O(len(lista))
,因为它将在lista
的所有元素上运行。
对于2000个元素,应与可以轻松放入主存储器的元素相同。您还提到每个元素都是唯一的,因此在设置的哈希值上不会发生冲突。
这里的另一个关键点是,您总是选择具有较小大小的集合以减少集合差异,因为这将减少运行时间。