使用Lambda函数节省时间+使用2D数组映射

时间:2019-06-07 13:42:46

标签: python for-loop lambda

我坚信使用lambda函数可以节省计算时间,但目前尚不清楚。看这个例子:

msvcr100d.dll

结果很简单: -lambda函数结果随时间变化为0.3514268280014221 s -带for循环:0.10633227700236603 s

如何编写具有竞争力的lambda函数?我注意到从de map对象获取结果的list函数在时间上不合适。还有其他方法吗? mesgrid函数当然也不是最好的...

欢迎小费!

3 个答案:

答案 0 :(得分:0)

内存分配需要时间(应该调用OS过程,可能会延迟)。
在lambda版本中,您分配了abmeshgridrst(列表和数组版本)+ return数组。
在for版本中,您分配了brst + 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(:) :) :))!!做得好!谢谢!