मैंने एक बेंचमार्क चलाया और sorted(lst, reverse=True) == lst
लंबी सूचियों के all(l[i] >= l[i+1] for i in xrange(len(l)-1))
लिए सबसे तेज़ था , और छोटी सूचियों के लिए सबसे तेज़ था । ये बेंचमार्क मैकबुक प्रो 2010 13 "(कोर 2 डुओ 2.66GHz, 4GB 1067MHz DDR3 रैम, मैक OS X 10.6.5) पर चलाए गए थे।
अद्यतन: मैंने स्क्रिप्ट को संशोधित किया ताकि आप इसे सीधे अपने सिस्टम पर चला सकें। पिछले संस्करण में बग थे। इसके अलावा, मैंने सॉर्ट किए गए और अनसर्टेड इनपुट्स दोनों को जोड़ा है।
- लघु क्रमबद्ध सूचियों के लिए सर्वश्रेष्ठ:
all(l[i] >= l[i+1] for i in xrange(len(l)-1))
- लंबी क्रमबद्ध सूचियों के लिए सर्वश्रेष्ठ:
sorted(l, reverse=True) == l
- छोटी अनसुलझी सूचियों के लिए सर्वश्रेष्ठ:
all(l[i] >= l[i+1] for i in xrange(len(l)-1))
- लंबी अनसुलझी सूचियों के लिए सर्वश्रेष्ठ:
all(l[i] >= l[i+1] for i in xrange(len(l)-1))
तो ज्यादातर मामलों में एक स्पष्ट विजेता है।
अद्यतन: aaronsterling के उत्तर (# 6 और # 7) वास्तव में सभी मामलों में सबसे तेज हैं। # 7 सबसे तेज़ है क्योंकि इसमें कुंजी को देखने के लिए अप्रत्यक्ष की एक परत नहीं है।
#!/usr/bin/env python
import itertools
import time
def benchmark(f, *args):
t1 = time.time()
for i in xrange(1000000):
f(*args)
t2 = time.time()
return t2-t1
L1 = range(4, 0, -1)
L2 = range(100, 0, -1)
L3 = range(0, 4)
L4 = range(0, 100)
# 1.
def isNonIncreasing(l, key=lambda x,y: x >= y):
return all(key(l[i],l[i+1]) for i in xrange(len(l)-1))
print benchmark(isNonIncreasing, L1) # 2.47253704071
print benchmark(isNonIncreasing, L2) # 34.5398209095
print benchmark(isNonIncreasing, L3) # 2.1916718483
print benchmark(isNonIncreasing, L4) # 2.19576501846
# 2.
def isNonIncreasing(l):
return all(l[i] >= l[i+1] for i in xrange(len(l)-1))
print benchmark(isNonIncreasing, L1) # 1.86919999123
print benchmark(isNonIncreasing, L2) # 21.8603689671
print benchmark(isNonIncreasing, L3) # 1.95684289932
print benchmark(isNonIncreasing, L4) # 1.95272517204
# 3.
def isNonIncreasing(l, key=lambda x,y: x >= y):
return all(key(a,b) for (a,b) in itertools.izip(l[:-1],l[1:]))
print benchmark(isNonIncreasing, L1) # 2.65468883514
print benchmark(isNonIncreasing, L2) # 29.7504849434
print benchmark(isNonIncreasing, L3) # 2.78062295914
print benchmark(isNonIncreasing, L4) # 3.73436689377
# 4.
def isNonIncreasing(l):
return all(a >= b for (a,b) in itertools.izip(l[:-1],l[1:]))
print benchmark(isNonIncreasing, L1) # 2.06947803497
print benchmark(isNonIncreasing, L2) # 15.6351969242
print benchmark(isNonIncreasing, L3) # 2.45671010017
print benchmark(isNonIncreasing, L4) # 3.48461818695
# 5.
def isNonIncreasing(l):
return sorted(l, reverse=True) == l
print benchmark(isNonIncreasing, L1) # 2.01579380035
print benchmark(isNonIncreasing, L2) # 5.44593787193
print benchmark(isNonIncreasing, L3) # 2.01813793182
print benchmark(isNonIncreasing, L4) # 4.97615599632
# 6.
def isNonIncreasing(l, key=lambda x, y: x >= y):
for i, el in enumerate(l[1:]):
if key(el, l[i-1]):
return False
return True
print benchmark(isNonIncreasing, L1) # 1.06842684746
print benchmark(isNonIncreasing, L2) # 1.67291283607
print benchmark(isNonIncreasing, L3) # 1.39491200447
print benchmark(isNonIncreasing, L4) # 1.80557894707
# 7.
def isNonIncreasing(l):
for i, el in enumerate(l[1:]):
if el >= l[i-1]:
return False
return True
print benchmark(isNonIncreasing, L1) # 0.883186101913
print benchmark(isNonIncreasing, L2) # 1.42852401733
print benchmark(isNonIncreasing, L3) # 1.09229516983
print benchmark(isNonIncreasing, L4) # 1.59502696991
key
उपयोग करने के लिए एक फ़ंक्शन पास हो सके।key=lambda x, y: x < y
एक अच्छा डिफ़ॉल्ट बनाता है।