【发布时间】:2014-08-11 00:07:26
【问题描述】:
如果我想找到列表的 a 最小值或集合 x 由该集合上的某个函数 f 给出,我可以使用方便的单行器,例如
min(x,key=f)
(4.91 微秒)
虽然对于“纯”min 函数,在大多数情况下返回多个元素是没有意义的(因为它们都是相同的,而对于集合只有一个),如果您选择最小值根据某些函数,您通常会想知道它最小的所有元素。
换句话说,我正在寻找一个简短、简洁和快速的函数,它允许我根据一些加权函数返回所有最小元素,它最好适用于列表和集合(并在输入的数据类型)。
对于列表,我写得最快的是
def allmin(x,f):
vals = map(f, x)
minval = min(vals)
return [x[i] for i,e in enumerate(vals) if e==minval]
6.73 微秒
但是,这远非最佳,并且不适用于集合。首先,在映射时,所有函数值在某个时间点都在内存中,因此这是确定最小值而不是再次查看最小值的最佳时间,这可以说明这已经慢了 50% 虽然没有额外的与单分钟示例相比,必须执行计算(列表构造除外)。与我设法编写的集合相比,唯一可比的东西是
def allmin(x,f):
vals = [(f(e), e) for e in x]
minval = min(vals)[0]
return {e for val,e in vals if val==minval}
8.44 µs(列表版本的列表理解为 7.29 µs)
我有什么方法可以让列表的性能达到更好的 allmin 列表版本的性能,最重要的是,接近 min(x,key=f) 的性能?
(为了说明和时间安排,我假设
f = lambda x: (x-4.5)**2
x = random.choice([[0,1,2,3,4,5,6,7,8,9,10,11,13],{0,1,2,3,4,5,6,7,8,9,10,11,13}])
)
【问题讨论】:
标签: python list python-2.7 set min