簡體   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