装饰器给Python函数调用增加了多少开销

2024-04-29 01:50:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在玩我的派伦应用程序的计时装饰器,为特定功能提供动态计时信息。我通过创建一个decorator来实现这一点,只需将它附加到控制器中我想要计时的任何函数。在

不过,有人指出,decorator可能会给调用增加相当多的开销,而且它们的运行速度比未修饰的函数慢2-3倍。在

首先,我希望执行一个修饰函数比一个未修饰的函数要花更长的时间,但是我希望它的开销在千分之一秒之内,与SQL insert调用相比可以忽略不计。decorator本身使用时间。时间()一些非常简单的聚合。在

装饰师会给系统增加大量的开销吗?我找不到任何证据。在


Tags: 函数功能信息应用程序sql系统时间动态
3条回答

知道什么是装饰效果很重要:

@decorator
def f():
    …

只是语法上的糖

^{pr2}$

因此,如果decorator不做任何事情,那么当调用修饰函数时就不会有任何开销(但是调用decorator(f)确实需要一点时间),比如

decorator = lambda func: func
@decorator
def f():
    …

如果decorator做了什么,那么您只得到decorator所涉及的任何时间开销。这通常包括一个附加的函数调用(修饰函数的调用),如

def decorator(func):
    def decorated_func():
        print "Before calling function", func  # Some overhead (but that's normal)
        func()  # This will be a second function call, after the call to decorated_func()
    return decorated_func

因此,就其本身而言,装饰一个函数并不会为您想做的事情增加太多的开销:原则上,您可以删除的唯一明显的开销是在修饰函数中不调用func(),而是复制它的完整代码,但是代码的易读性会受到影响(易读性和灵活性是装饰器首先存在的一些原因)。在

使用decorator增加的开销应该只是一个额外的函数调用。在

decorator所做的工作不是开销的一部分,因为您可以选择向装饰对象添加等效代码。在

因此,decorate函数的运行时间可能是未修饰函数的两倍,但这是因为decorator正在做一些重要的工作,这些工作的有趣时间与未修饰的函数大致相同。在

Do decorators add significant overhead to a system? I can't find anything to back that up.

它们几乎没有增加可测量的开销。零。在

需要注意的是,decorator运行一次来创建装饰函数。 一次。在

装饰功能有两个部分。在

  1. 不管加了什么装饰。这不是开销。

  2. 加上原来的功能。这不是开销。

根本没有真正的开销。您也许可以谨慎地测量一个额外的函数调用的开销,并将其作为修饰函数的一部分返回,但这几乎是无法测量的。而且它可能比不使用装饰的另类设计要少得多。在

相关问题 更多 >