我最初建议使用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上执行的。
sorted.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))
walk.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))
generator.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))
izip.py
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
是最好的选择。
list(reversed(sorted(lis)))==lis
- Ashwini Chaudhary