我需要以下功能:
输入:alist
输出:
True
如果输入列表中的所有元素使用标准的相等运算符求值为彼此相等False
否则。性能:当然,我不希望产生任何不必要的开销。
我觉得最好:
但我不知道什么是最Python式的方法。
编辑:
谢谢你的回答。我评价了几个,很难在@KennyTM和@Ivo van der Wijk解决方案之间做出选择。
短路特性的缺乏只会损害早期具有不等元件的长输入(超过50个元件)。如果这种情况经常发生(发生的频率取决于列表的长度),则需要短路。最好的短路算法似乎是@KennyTMcheckEqual1
。然而,它为此付出了巨大的代价:
如果具有早期不等元件的长输入不发生(或很少发生),则不需要短路。到目前为止,最快的是@Ivo van der Wijk解决方案。
最简单、最优雅的方式如下:
(是的,这甚至适用于空列表!这是因为这是python具有惰性语义的少数情况之一。)
在性能方面,这将在尽可能早的时间失败,因此它是渐近最优的。
一个比在序列(不是iterable)上使用set()更快的解决方案是简单地计算第一个元素。这假设列表是非空的(但这很容易检查,并决定空列表中的结果应该是什么)
一些简单的基准:
一般方法:
一行:
还有一行:
三个版本的区别在于:
checkEqual2
中,内容必须是可散列的。checkEqual1
和checkEqual2
可以使用任何迭代器,但是checkEqual3
必须接受序列输入,通常是列表或元组之类的具体容器。checkEqual1
发现差异后立即停止。checkEqual1
包含更多的Python代码,因此当许多项在开始时相等时,效率会降低。checkEqual2
和checkEqual3
总是执行O(N)复制操作,因此如果大多数输入返回False,它们将花费更长的时间。checkEqual2
和checkEqual3
来说,很难适应从a == b
到a is b
的比较。timeit
结果,对于Python 2.7和(只有s1、s4、s7、s9应该返回True)我们得到
注:
相关问题 更多 >
编程相关推荐