我有下面的代码,它列举了n行的交集,其中感兴趣的交叉点仅在x > 0
,并且对于每个交叉点,我将保持在交叉点右边的顺序,行按顺序排列他们的坡度。
def enum_itsc(k, b):
n = len(k)
itsc_list = dict()
for i in xrange(n):
for j in xrange(i + 1, n):
x = (b[j] - b[i]) / (k[i] - k[j])
y = x * k[i] + b[i]
if x <= 0:
continue
if (x, y) in itsc_list:
itsc_list[(x, y)].update([i, j])
else:
itsc_list[(x,y)] = set([i, j])
for itsc in itsc_list:
itsc_list[itsc] = list(itsc_list[itsc])
itsc_list[itsc].sort(key=lambda i: k[i])
return itsc_list
经过一些简介后,似乎lambda
函数的成本很高。我该如何改进代码?或者这就是它,并且没有办法改进。
答案 0 :(得分:0)
尽可能使用内置函数作为key
的{{1}}。在这种情况下,sort
相当于key=lambda i: k[i]
我做了一个带有虚拟值的小测试,看到改变它的速度大约是1.5-2倍。 (仅对排序操作)。当然,根据您的数据,这可能会有所不同。
key=k.__getitem__
标准库函数的另一个好的来源是key
模块(例如operator
,operator.itemgetter
...)