【问题标题】:Fastest way to compare elements in a list python [duplicate]比较列表python中元素的最快方法[重复]
【发布时间】:2019-09-06 00:38:43
【问题描述】:

我很好奇在确定两个列表中是否存在不相似元素时哪种实现会更快。在这里,两个列表的长度相同,并且只有一个元素不相同。

实施 #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 左右,其中每个元素都是一个唯一的字符串)的最快方法。我只使用字符是为了例子)。感谢所有提前回复的人。

【问题讨论】:

  • 为什么是重复的?互联网上有很多解决方案,给出了两种不同的答案。

标签: python list performance set comparison


【解决方案1】:

这是从实时 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。记住 timeit 默认会运行 1000000 次。

现在为什么集合要快得多?集合使用哈希算法而不是索引。这意味着 loopkup 对于集合来说要快得多,因为它不需要迭代来找到一个值。此外,for 循环有一个打印、一个范围和一个比较,它不仅速度较慢,而且做的事情也更多。

【讨论】:

  • 打印在实施 2 中可能需要一些时间。
  • 是的,但通常stdout是缓冲的,所以打印不会阻塞,当然这完全取决于输出设备,我在说过这个,for循环也有打印,. ..
  • 我没有考虑运行时间的打印。我正在测试它,似乎实现 2 更快?
  • @otterdog 您是否尝试使用不同的数据集大小多次运行它?一项测试无法真正告诉您速度。
  • 是的,如果没有打印,时间会下降到 0.8392677060001006,这样会更快
【解决方案2】:

根据此处的文档 https://wiki.python.org/moin/TimeComplexitys-t 的设置差异在最好的情况下采用 O(len(s))。看看https://stackoverflow.com/a/48044412/3236440

所以,您的实施 #1 需要 O(len(lista)) 并且您的实施#2 也采用O(len(lista)),因为它将在lista 的所有元素上运行。

对于 2000 个元素,它应该与它们可以轻松放入主存储器的相同。您还提到每个元素都是唯一的,因此集合哈希不会发生冲突。

这里的另一个关键点是,您总是选择尺寸较小的集合来获得集合差异,因为它会花费更少的运行时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2019-09-22
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2020-09-20
    相关资源
    最近更新 更多