私はもともと を使用することを提案しましたが、あなたの反復よりも効率が悪いかもしれないと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
すべてのビートを使用します。