高阶函数functools.partial()可以创建如下新函数:
newf(arg1) = functools.partial( f, arg1, val )这显然相当于说
def newf(arg1): return f( arg1, val )就他们的所作所为而言。但是表演呢?functools.partial()是否真的创建了一个不需要调用f的新函数,或者它们是完全相同的?
发布于 2014-10-07 01:38:55
> 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发布于 2014-10-07 01:34:41
这是python3.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代码这里。
发布于 2014-10-07 02:03:47
下面是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 newfunchttps://stackoverflow.com/questions/26227287
复制相似问题