lambda比python中的函数调用慢,为什么

lambda比python中的函数调用慢,为什么,python,function,lambda,Python,Function,Lambda,我认为lambda比函数调用快,但经过测试,我发现我错了。函数调用肯定比lambda调用快 有人能告诉我为什么吗 如何在Python中加速函数调用 我正在使用Ubuntu 14.04和Python 2.7.6 >>> timeit('def a():return 222*333 ;a()') 0.08195090293884277 >>> timeit('a=lambda:222*333 ;a()') 0.11071300506591797 >>

我认为lambda比函数调用快,但经过测试,我发现我错了。函数调用肯定比lambda调用快

有人能告诉我为什么吗

如何在Python中加速函数调用

我正在使用Ubuntu 14.04和Python 2.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
timeit('defa():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             

调用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
请注意,
timeit.repeat
也接受一个
repeat
参数:

>>> min(timeit.repeat(a, repeat=100))
0.06456905393861234
>>> min(timeit.repeat(b, repeat=100))
0.06374448095448315

这些差异太小而不显著。

如上所述,您的第一次测试只分析定义
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

这是很重要的一点。人们有时会认为“lambda函数”是一种特殊的东西,但事实并非如此:
lambda
只是一个用来制作普通旧函数的关键字,因为它可以内联使用,所以非常方便。就这样。它们没有魔力。@DSM实际上lambda相当于包含单个返回语句的函数的更严格的情况。因此,编译lambda可能比编译函数要简单一些。@augurar:这是我第一次听到有人说lambda(或Python中的任何语法选择)的优点是编译更简单。无论如何,重点不是lambda可以用来生成任何函数,而是lambda关键字创建的是一个函数,而不是“lambda函数”。对不起,我犯了一个愚蠢的错误。。。我做了这个测试,没有明显的区别<代码>>>timeit('a()',setup=“def a():return 222*333”)0.07061290740966797>>timeit('a()',setup=“a=lambda:222*333”)0.06967616081237793
>>> min(timeit.repeat(a, repeat=100))
0.06456905393861234
>>> min(timeit.repeat(b, repeat=100))
0.06374448095448315
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