我认为lambda比函数调用更快,但是经过测试,我发现我错了。函数调用肯定比lambda调用快。
有人能告诉我为什么吗?
以及如何在Python中加速函数调用?
我正在使用Ubuntu14.04和Python2.7.6
>>> timeit('def a():return 222*333 ;a()')
0.08195090293884277
>>> timeit('a=lambda:222*333 ;a()')
0.11071300506591797
>>> timeit('a=lambda: [].extend(range(10)) ;a()')
0.40241098403930664
>>> timeit('a=lambda: [].extend(range(10)) ;a()')
0.4011270999908447
>>> timeit('a=lambda: [].extend(range(10)) ;a()')
0.4064619541168213
>>> timeit('def a(): return [].extend(range(10)) ;a()')
0.07965493202209473
>>> timeit('def a(): return [].extend(range(10)) ;a()')
0.08039593696594238
>>> timeit('def a(): return [].extend(range(10)) ;a()')
0.08103609085083008
>>> timeit('def a(): return [].extend(range(10)) ;a()')
0.08639097213745117对不起,我错了,没有什么区别。正确测试:
>>> timeit('a()', setup="def a():return 222*333")
0.07061290740966797
>>> timeit('a()', setup="a=lambda: 222*333")
0.06967616081237793发布于 2014-10-24 03:30:07
timeit('def a(): return [].extend(range(10)) ;a()')没有调用a();对a()的调用是a定义的一部分
In [34]: def a(): return [].extend(range(10)) ;a()
In [35]: import dis
In [36]: dis.dis(a)
1 0 BUILD_LIST 0
3 LOAD_ATTR 0 (extend)
6 LOAD_GLOBAL 1 (range)
9 LOAD_CONST 1 (10)
12 CALL_FUNCTION 1
15 CALL_FUNCTION 1
18 RETURN_VALUE
19 LOAD_GLOBAL 2 (a)
22 CALL_FUNCTION 0 #<-- a is called
25 POP_TOP 如果单独测试这些片段,差异是可以忽略不计的:
In [24]: %timeit a=lambda: [].extend(range(10))
10000000 loops, best of 3: 68.6 ns per loop
In [25]: %timeit def a2(): return [].extend(range(10))
10000000 loops, best of 3: 68.8 ns per loop
In [22]: %timeit a()
1000000 loops, best of 3: 445 ns per loop
In [23]: %timeit a2()
1000000 loops, best of 3: 442 ns per loop发布于 2014-10-24 03:35:10
如上所述,您的第一个测试只描述定义a所需的时间。实际上从来没有打过电话。
Lambda表达式和"normal“函数生成完全相同的字节码,如果使用dis模块,您可以看到:
def a(): return 10
b = lambda: 10
import dis
>>> dis.dis(a)
1 0 LOAD_CONST 1 (10)
3 RETURN_VALUE
>>> dis.dis(b)
1 0 LOAD_CONST 1 (10)
3 RETURN_VALUE发布于 2014-10-24 03:32:30
调用lambda和函数没有区别。lambda只是用一个表达式创建的函数,没有名称。
假设我们有两个相同的函数,一个用函数定义创建,另一个用lambda表达式创建:
def a():
return 222*333
b = lambda: 222*333我们看到两者都是相同类型的函数对象,并且它们都共享等效的字节代码:
>>> type(a)
<class 'function'>
>>> type(b)
<class 'function'>
>>> import dis
>>> dis.dis(a)
2 0 LOAD_CONST 3 (73926)
2 RETURN_VALUE
>>> dis.dis(b)
1 0 LOAD_CONST 3 (73926)
2 RETURN_VALUE你怎么能加快速度?你不知道。是Python。这是为您预先优化的。这段代码对你来说已经没有什么关系了。
也许您可以将它交给另一个解释器,或者用另一种语言重写它,但是如果您坚持使用Python,那么现在没有什么可做的了。
计时
这是我如何检查时间的方法。
Timeit的timeit和repeat都是可调用的:
import timeit请注意,timeit.repeat还接受一个repeat参数:
>>> min(timeit.repeat(a, repeat=100))
0.06456905393861234
>>> min(timeit.repeat(b, repeat=100))
0.06374448095448315这些差异太小,不足以引起人们的注意。
https://stackoverflow.com/questions/26540885
复制相似问题