[英]Is there a cost to using functools.partial()?
高阶函数functools.partial()
可以创建一个新函数,如下所示:
newf(arg1) = functools.partial( f, arg1, val )
这显然等于只说
def newf(arg1): return f( arg1, val )
在他们的工作方面。 但是性能如何呢? functools.partial()
是否实际上创建了一个不需要调用f
的新函数,或者它们是否相同?
> import functools
> def nop():
...: pass
...:
> %timeit nop()
10000000 loops, best of 3: 63.5 ns per loop
> %timeit functools.partial(nop)()
1000000 loops, best of 3: 205 ns per loop
所以我想说,除非您做一些愚蠢的事情,否则这看起来是微不足道的。 如果我们要多次调用局部调用,我们可以收回大部分:
> f = functools.partial(nop)
> %timeit f()
10000000 loops, best of 3: 86.7 ns per loop
这是python 3.4中functools.partial
的源代码:
def partial(func, *args, **keywords):
"""New function with partial application of the given arguments
and keywords.
"""
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
try:
from _functools import partial
except ImportError:
pass
在顶部,它定义了纯python后备版本,在底部,它尝试导入C版本。 您可以在此处找到C代码。
这是partial
的当前实现。
你听得懂么? 否则,但由于所有内部和外部功能,我发现很难清楚地进行解释。
def partial(func, *args, **keywords):
"""New function with partial application of the given arguments
and keywords.
"""
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.