Python 内联计算vs Lambda
内联计算的时间范围为0.0000665到0.0000813。 而lambda的值在0.0004215到0.0004265之间。Python 内联计算vs Lambda,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,内联计算的时间范围为0.0000665到0.0000813。 而lambda的值在0.0004215到0.0004265之间。 为什么时间上会有如此巨大的差异?我可以看出两个可能的原因: item*item产生与item**2相同的结果,但您正在假设**运算符的实现。不过,更重要的原因是 lambda实际上是一个函数-它与您使用def在同一范围内声明的函数具有相同的闭包,并且以与该函数相同的方式,它在执行时将获得自己的堆栈帧。创建、推送和丢弃这样的帧需要时间,这可能就是引入如此大开销的原因。引述
为什么时间上会有如此巨大的差异?我可以看出两个可能的原因:
item*item
产生与item**2
相同的结果,但您正在假设**
运算符的实现。不过,更重要的原因是lambda
实际上是一个函数-它与您使用def
在同一范围内声明的函数具有相同的闭包,并且以与该函数相同的方式,它在执行时将获得自己的堆栈帧。创建、推送和丢弃这样的帧需要时间,这可能就是引入如此大开销的原因。引述自:- 内联
item*item
- 内联
项目**2
- def foo(x)的用法:返回x*x
- def foo(x)的用法:返回x**2
- 使用
lambda x:x*x
- 使用
lambda x:x**2
另外:使用intead of
time.time()
-它更可靠在测量执行时间方面,有更广泛的可能性,尽管我真的建议使用timeit
,因为它正是为您想要在这里执行的工作类型而创建的。我可以看到两个可能的原因:
item*item
产生与item**2
相同的结果,但您正在假设**
运算符的实现。不过,更重要的原因是lambda
实际上是一个函数-它与您使用def
在同一范围内声明的函数具有相同的闭包,并且以与该函数相同的方式,它在执行时将获得自己的堆栈帧。创建、推送和丢弃这样的帧需要时间,这可能就是引入如此大开销的原因。引述自:- 内联
item*item
- 内联
项目**2
- def foo(x)的用法:返回x*x
- def foo(x)的用法:返回x**2
- 使用
lambda x:x*x
- 使用
lambda x:x**2
另外:使用intead of
time.time()
-它更可靠在测量执行时间时,有更广泛的可能性列表,尽管我真的建议使用timeit
,因为它完全是为您想要在这里执行的工作类型创建的。这两种情况不可比较,在第一种情况下,您只是在一个列表上迭代,将项提升为幂2,在第二种情况下,调用lambda函数,将变量传递给它进行计算,然后返回项,当然函数调用要比乘法长得多调用要花那么多时间?x**2
的工作原理不同于x*x
…函数调用意味着跳转到内存中的不同位置,初始化局部变量等…@Djokester是的。在进行函数调用时,Python会在后台调用函数对象上的其他几个方法。它还必须为函数调用创建一个新框架。所有这些事情都比简单地执行x*x
要花费更多的时间。这两种情况是不可比较的,第一种情况下,您只是在一个列表上迭代,将项提升为2的幂,第二种情况下,您调用lambda函数,将变量传递给它进行计算,然后返回项,当然函数调用要比乘法长得多调用要花那么多时间?x**2
的工作原理不同于x*x
…函数调用意味着跳转到内存中的不同位置,初始化局部变量,等等。@Djokester是的。在进行函数调用时,Python会在后台调用函数对象上的其他几个方法。它还必须为函数调用创建一个新框架。所有这些事情都比简单地做x*x
要花更多的时间。
lst = [randint(0,i) for i in range(0,1000)]
start = time.time()
lst = [item*item for item in lst]
end = time.time()
print('%.7f' %(start - end))
f = lambda x: x**2
lst = [randint(0,i) for i in range(0,1000)]
start = time.time()
lst = [f(item) for item in lst]
end = time.time()
print('%.7f' %(start - end))