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

che*_*ish 6 python lambda function

我认为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
Run Code Online (Sandbox Code Playgroud)

对不起我的错误,没有区别.正确的测试:

>>> timeit('a()', setup="def a():return 222*333")
0.07061290740966797
>>> timeit('a()', setup="a=lambda: 222*333")
0.06967616081237793
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 12

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             
Run Code Online (Sandbox Code Playgroud)

如果您单独测试这些部分,差异可以忽略不计:

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
Run Code Online (Sandbox Code Playgroud)


Max*_*oel 8

如上所述,您的第一个测试仅描述了定义 所需的时间a.它实际上从未被调用过.

Lambda表达式和"普通"函数生成完全相同的字节码,如果您使用该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
Run Code Online (Sandbox Code Playgroud)

  • 这是一个重点.人们有时认为"lambda函数"是一种特殊的东西,但它们不是:`lambda`只是一个用来制作一个普通旧函数的关键字,大多数都是方便的,因为它可以在线使用.而已.他们没有神奇的力量. (2认同)

Aar*_*all 7

调用 lambda 与调用函数没有区别。lambda 只是一个用单个表达式创建的函数,没有名称。

假设我们有两个相同的函数,一个用函数定义创建,另一个用 lambda 表达式创建:

def a():
    return 222*333

b = lambda: 222*333
Run Code Online (Sandbox Code Playgroud)

我们看到两者都是相同类型的函数对象,并且它们共享等效的字节码:

>>> 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
Run Code Online (Sandbox Code Playgroud)

你怎么能加快速度?你没有。是 Python。它是为您预先优化。您无需再处理此代码。

也许你可以把它交给另一个解释器,或者用另一种语言重写它,但如果你坚持使用 Python,现在就没有什么可做的了。

计时

这是我检查时间的方法。

Timeittimeitrepeat两者都可以调用:

import timeit
Run Code Online (Sandbox Code Playgroud)

请注意,timeit.repeat它也需要一个repeat参数:

>>> min(timeit.repeat(a, repeat=100))
0.06456905393861234
>>> min(timeit.repeat(b, repeat=100))
0.06374448095448315
Run Code Online (Sandbox Code Playgroud)

这些差异太小,不显着。