我坚信使用lambda函数可以节省计算时间,但目前尚不清楚。看这个例子:
msvcr100d.dll
结果很简单: -lambda函数结果随时间变化为0.3514268280014221 s -带for循环:0.10633227700236603 s
如何编写具有竞争力的lambda函数?我注意到从de map对象获取结果的list函数在时间上不合适。还有其他方法吗? mesgrid函数当然也不是最好的...
欢迎小费!
答案 0 :(得分:0)
内存分配需要时间(应该调用OS过程,可能会延迟)。
在lambda版本中,您分配了a
,b
,meshgrid
,rst
(列表和数组版本)+ return
数组。
在for版本中,您分配了b
和rst
+ return
数组。 a
是一个生成器,因此无需花费任何时间即可将其创建并加载到内存中。
这就是为什么您使用lambda的功能较慢的原因。
此外,请勿使用list
处理np数组操作的结果以将其转换回np数组。
只需删除list()
,它就会变得更快(从0.9到0.4)。
def f_with_lambda():
a = np.array(range(SIZE))
b = np.array(range(SIZE))
A,B = np.meshgrid(a,b)
rst = map(lambda x,y : x+y , A, B)
return np.array(rst)
有关速度比较,请参见https://stackoverflow.com/a/46470401/9453926。
答案 1 :(得分:0)
我压缩了代码:
import numpy as np
import timeit
def f_with_lambda():
A,B = np.meshgrid(range(150),range(150))
return np.array(list(map(lambda x,y : x+y , A, B)))
def f_with_for():
return np.array([np.array(range(150))+x for x in range(150)])
if __name__ == '__main__':
print(timeit.timeit("f_with_lambda()",setup = "from __main__ import f_with_lambda",number = 10000))
print(timeit.timeit("f_with_for()",setup = "from __main__ import f_with_for",number = 10000))
这次,对于5x5,结果是
Lambda vs for
0.38113487999726203和0.24913009200099623
150更好:
2.680842614001449和20.176408246999927
但是我发现没有办法将mesgrid集成到lambda函数中。数组前面的列表转换也很麻烦。
答案 2 :(得分:0)
考虑有关该列表的评论:
import numpy as np
import timeit
def f_with_lambda():
A,B = np.meshgrid(range(150),range(150))
return np.array(map(lambda x,y : x+y , A, B))
def f_with_for():
return np.array([np.array(range(150))+x for x in range(150)])
if __name__ == '__main__':
print(timeit.timeit("f_with_lambda()",setup = "from __main__ import f_with_lambda",number = 10000))
print(timeit.timeit("f_with_for()",setup = "from __main__ import f_with_for",number = 10000))
它正在改变很多事情。这次(lambda vs for)
5: 0.30227499100146815和0.2510572589999356(非常相似)
表示150: 0.6687559890015109与20.31807473200024(:) :) :))!!做得好!谢谢!