繁体   English   中英

使用functools.partial()是否需要付费?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM