PooH
Чем он им помешал то?!
Ну вроде бы тем, что “пересекался” с lt, le, eq, ne, gt, ge.
FishHook
а чем, собственно, вариант с лямбдой хуже или лучше варианта с itemgetter
В CPython itemgetter реализован на Cи
Pysrc/Modules/operator.c:325:/* itemgetter object
соответственно скорость выполнения выше.
import timeit
from operator import itemgetter
def bench_lambda_key(buf):
return sorted(buf, key=lambda x: (x[2],x[1],x[0]))
def bench_lambda_auto_key(buf):
return sorted(buf, key=lambda x: reversed(x))
def bench_itemgetter(buf):
return sorted(buf, key=itemgetter(2,1,0))
def bench_keyfunc(buf):
def keyfunc(x):
return x[2],x[1],x[0]
return sorted(buf, key=keyfunc)
def measure(func, arg, times):
print " %s %s" % (func.__name__, timeit.timeit(lambda: func(arg),
number=times))
buffs = [[(i,i,i) for i in range(val,0,-1)]
for val in (1000, 10000, 100000, 10000000)]
print [(buf[0],buf[-1]) for buf in buffs]
funcs = [func for name,func in globals().items() if name.startswith('bench_')] + [sorted]
for buf in buffs:
assert buf[-1] < buf[0]
assert buf[-1] == (1,1,1)
print "Buflen:", len(buf)
for func in funcs:
measure(func, buf, 3)
Python 2.7.3 (64-bit)
[((1000, 1000, 1000), (1, 1, 1)), ((10000, 10000, 10000), (1, 1, 1)), ((100000,
100000, 100000), (1, 1, 1)), ((10000000, 10000000, 10000000), (1, 1, 1))]
Buflen: 1000
bench_itemgetter 0.00191706278265
bench_keyfunc 0.00287790388817
bench_lambda_key 0.00287559417398
bench_lambda_auto_key 0.00300378331185
sorted 0.000578968358455
Buflen: 10000
bench_itemgetter 0.0194231565786
bench_keyfunc 0.0218749181976
bench_lambda_key 0.0152325651224
bench_lambda_auto_key 0.0141616276402
sorted 0.00305036254814
Buflen: 100000
bench_itemgetter 0.130403383885
bench_keyfunc 0.179477496455
bench_lambda_key 0.178710286389
bench_lambda_auto_key 0.152915013296
sorted 0.040913892315
Buflen: 10000000
bench_itemgetter 14.2914632193
bench_keyfunc 19.6054661696
bench_lambda_key 19.6240705325
bench_lambda_auto_key 17.0308593215
sorted 4.21384796845
pypy 1.9.0 (32-bit)
Buflen: 1000
bench_itemgetter 0.0267988439111
bench_keyfunc 0.00317316235289
bench_lambda_key 0.00303457950113
bench_lambda_auto_key 0.00624893175718
sorted 0.000451934077677
Buflen: 10000
bench_itemgetter 0.0240387354469
bench_keyfunc 0.0165294696434
bench_lambda_key 0.0145931592425
bench_lambda_auto_key 0.0314840991576
sorted 0.00325438730212
Buflen: 100000
bench_itemgetter 0.298087864608
bench_keyfunc 0.200838888196
bench_lambda_key 0.201263105703
bench_lambda_auto_key 0.219333539668
sorted 0.0355272538576
Buflen: 10000000
bench_itemgetter 48.9225983977
bench_keyfunc 30.2210835331
bench_lambda_key 29.9068399876
bench_lambda_auto_key 30.5330650985
sorted 4.42660690666