Python 内联计算vs Lambda

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在同一范围内声明的函数具有相同的闭包,并且以与该函数相同的方式,它在执行时将获得自己的堆栈帧。创建、推送和丢弃这样的帧需要时间,这可能就是引入如此大开销的原因。引述

内联计算的时间范围为0.0000665到0.0000813。 而lambda的值在0.0004215到0.0004265之间。
为什么时间上会有如此巨大的差异?

我可以看出两个可能的原因:

  • item*item
    产生与
    item**2
    相同的结果,但您正在假设
    **
    运算符的实现。不过,更重要的原因是
  • lambda
    实际上是一个函数-它与您使用
    def
    在同一范围内声明的函数具有相同的闭包,并且以与该函数相同的方式,它在执行时将获得自己的堆栈帧。创建、推送和丢弃这样的帧需要时间,这可能就是引入如此大开销的原因。引述自:
  • 从语义上讲,它们(lambdas)只是普通语法的语法糖 函数定义

    尝试对以下计算进行基准测试:

    • 内联
      item*item
    • 内联
      项目**2
    • def foo(x)的用法:返回x*x
    • def foo(x)的用法:返回x**2
    • 使用
      lambda x:x*x
    • 使用
      lambda x:x**2
    你会找出真正的原因(请分享这些结果,我自己也有点感兴趣)。我认为前两种方法在效率上是相似的,接下来的4种方法也是相似的,但比那些内联的方法慢几个数量级


    另外:使用intead of
    time.time()
    -它更可靠在测量执行时间方面,有更广泛的可能性,尽管我真的建议使用
    timeit
    ,因为它正是为您想要在这里执行的工作类型而创建的。

    我可以看到两个可能的原因:

  • item*item
    产生与
    item**2
    相同的结果,但您正在假设
    **
    运算符的实现。不过,更重要的原因是
  • lambda
    实际上是一个函数-它与您使用
    def
    在同一范围内声明的函数具有相同的闭包,并且以与该函数相同的方式,它在执行时将获得自己的堆栈帧。创建、推送和丢弃这样的帧需要时间,这可能就是引入如此大开销的原因。引述自:
  • 从语义上讲,它们(lambdas)只是普通语法的语法糖 函数定义

    尝试对以下计算进行基准测试:

    • 内联
      item*item
    • 内联
      项目**2
    • def foo(x)的用法:返回x*x
    • def foo(x)的用法:返回x**2
    • 使用
      lambda x:x*x
    • 使用
      lambda x:x**2
    你会找出真正的原因(请分享这些结果,我自己也有点感兴趣)。我认为前两种方法在效率上是相似的,接下来的4种方法也是相似的,但比那些内联的方法慢几个数量级


    另外:使用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))