2014-10-07 2 views
-1

Функция высшего порядка functools.partial() может создать новую функцию следующим образом:Есть ли стоимость использования functools.partial()?

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

, который, очевидно, эквивалентно просто говоря

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

с точки зрения того, что они делают. Но как насчет производительности? functools.partial() действительно создает новую функцию, которая не требует вызова f или они идентичны?

+1

Быстрый поиск в Google выявляет ряд похожих или повторяющихся вопросов. Это [верхний результат] (http://stackoverflow.com/questions/17388438/python-functools-partial-efficiency). Это может помочь, если вы использовали более конкретный заголовок; вы особенно заинтересованы в производительности, а не просто о чем-то. –

ответ

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 
+0

Что это за оболочка? –

+0

Я согласен с этим ответом. Я не могу думать о причине, что «частичный» был бы дорогим. Так что пойдите для этого;) – brunsgaard

+0

Я предполагаю, что я действительно пытаюсь спросить, является ли две функции полностью идентичными или если есть какая-то разница в том, как они выполняются. – NotNotLogical

1

Это исходный код functools.partial в Python 3.4:

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 

на вершине она определяет чисто питон откат версию, и на дне он пытается импортировать версию C. Вы можете найти код C here.

0

Вот текущая реализация partial.

Вы понимаете? Else спросить, но мне было очень трудно объяснить чисто из-за всех внутренних и внешних функций.

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 
Смежные вопросы