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