我最初建议 using sorted
,有人向我指出它可能比您的迭代效率低。
>>> l = [3, 1, 2]
>>> l == sorted(l, reverse=True)
False
>>> l = [3, 2, 1]
>>> l == sorted(l, reverse=True)
True
所以我对接受的答案进行了基准测试,我的,Lattyware 的生成器解决方案,和itertools.izip
. 我特意使用了一个我认为有利于我的sorted
解决方案的案例:一个仅在最后无序的列表。这些基准测试是在旧 OpenBSD 机器上的 Python 2.7.1 上执行的。
排序的.py
import time
l = list(reversed(range(99998) + [99999, 99998]))
start = time.time()
for count in range(100):
l == sorted(l)
end = time.time()
print('elapsed: {}'.format(end - start))
步行.py
import time
def ordertest(l):
for i in range(len(l) - 1):
if l[i] < l[i+1]:
return False
return True
l = list(reversed(range(99998) + [99999, 99998]))
start = time.time()
for count in range(100):
ordertest(l)
end = time.time()
print('elapsed: {}'.format(end - start))
生成器.py
import time
l = list(reversed(range(99998) + [99999, 99998]))
start = time.time()
for count in range(100):
all(earlier >= later for earlier, later in zip(l, l[1:]))
end = time.time()
print('elapsed: {}'.format(end - start))
压缩包
import itertools
import time
l = list(reversed(range(99998) + [99999, 99998]))
start = time.time()
for count in range(100):
all(earlier >= later for earlier, later in itertools.izip(l, l[1:]))
end = time.time()
print('elapsed: {}'.format(end - start))
结果:
$ python sorted.py
elapsed: 1.0896859169
$ python walk.py
elapsed: 0.641126155853
$ python generator.py
elapsed: 4.79061508179
$ python izip.py
elapsed: 0.363445997238
正如对此答案的评论中所指出的那样,生成器表达式可能会通过zip
制作列表的副本而变慢。使用izip
节拍所有。