【问题标题】:Is there a cost to using functools.partial()?使用 functools.partial() 是否有成本?
【发布时间】:2014-10-07 10:03:47
【问题描述】:

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

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

这显然相当于只是说

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

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

【问题讨论】:

  • 快速 Google 搜索会发现许多类似或重复的问题。这是top result。如果您也使用更具体的标题可能会有所帮助;您特别关注性能,而不仅仅是“关于”它。

标签: python python-3.x


【解决方案1】:
> 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

【讨论】:

  • 我同意这个答案。我想不出partial 会很贵的原因。所以去吧;)
  • 我想我真正想问的是这两个函数是否完全相同,或者它们的执行方式是否存在一些差异。
【解决方案2】:

这是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

【讨论】:

    【解决方案3】:

    这是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
    

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 2022-09-24
      相关资源
      最近更新 更多