CPython 3.6.4:
from functools import partial
def add(x, y, z, a):
return x + y + z + a
list_of_as = list(range(10000))
def max1():
return max(list_of_as , key=lambda a: add(10, 20, 30, a))
def max2():
return max(list_of_as , key=partial(add, 10, 20, 30))
сейчас:
In [2]: %timeit max1()
4.36 ms ± 42.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [3]: %timeit max2()
3.67 ms ± 25.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Я думал, что partial
просто запоминает часть параметров, а затем пересылает их в исходную функцию при вызове с остальными параметрами (так что это не что иное, как ярлык), но, похоже, делает некоторую оптимизацию. В моем случае вся функция max2
оптимизируется на 15% по сравнению с max1
, что довольно приятно.
Было бы здорово узнать, что такое оптимизация, поэтому я мог бы использовать ее более эффективно. Документы молчат относительно любой оптимизации. Неудивительно, что "примерно эквивалентная" реализация (данная в документах) не оптимизируется вообще:
In [3]: %timeit max2() # using 'partial' implementation from docs
10.7 ms ± 267 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)