使用functools.partial()会有成本吗?

时间:2014-10-07 01:28:42

标签: python python-3.x

高阶函数functools.partial()可以创建一个新函数,如下所示:

newf(arg1) = functools.partial( f, arg1, val )

这显然相当于只说

def newf(arg1): return f( arg1, val )

就他们的行为而言。但性能呢? functools.partial()是否真的创建了一个不需要调用f或者它们是否相同的新函数?

3 个答案:

答案 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