Tôi đã chạy một điểm chuẩn và sorted(lst, reverse=True) == lst
là nhanh nhất cho danh sách dài, và all(l[i] >= l[i+1] for i in xrange(len(l)-1))
là nhanh nhất cho danh sách ngắn . Các điểm chuẩn này được chạy trên MacBook Pro 2010 13 "(Core2 Duo 2.66GHz, RAM DDR3 4GB 1067 MHz, Mac OS X 10.6.5).
CẬP NHẬT: Tôi đã sửa đổi tập lệnh để bạn có thể chạy nó trực tiếp trên hệ thống của riêng bạn. Phiên bản trước có lỗi. Ngoài ra, tôi đã thêm cả đầu vào được sắp xếp và chưa sắp xếp.
- Tốt nhất cho danh sách được sắp xếp ngắn:
all(l[i] >= l[i+1] for i in xrange(len(l)-1))
- Tốt nhất cho danh sách sắp xếp dài:
sorted(l, reverse=True) == l
- Tốt nhất cho danh sách chưa được sắp xếp ngắn:
all(l[i] >= l[i+1] for i in xrange(len(l)-1))
- Tốt nhất cho danh sách dài chưa sắp xếp:
all(l[i] >= l[i+1] for i in xrange(len(l)-1))
Vì vậy, trong hầu hết các trường hợp có một người chiến thắng rõ ràng.
CẬP NHẬT: câu trả lời của aaronsterling (# 6 và # 7) thực sự là nhanh nhất trong mọi trường hợp. # 7 là nhanh nhất vì nó không có lớp cảm ứng để tra cứu khóa.
#!/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
chức năng để sử dụng.key=lambda x, y: x < y
làm cho một mặc định tốt.