高阶函数functools.partial()
可以创建一个新函数,如下所示:
newf(arg1) = functools.partial( f, arg1, val )
这显然相当于只说
def newf(arg1): return f( arg1, val )
就他们的行为而言。但性能呢? functools.partial()
是否真的创建了一个不需要调用f
或者它们是否相同的新函数?
答案 0 :(得分:2)
> 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
答案 1 :(得分:1)
这是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代码here。
答案 2 :(得分:0)
以下是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