Я ищу способ частичного применения функций в python, которые просты для понимания, удобочитаемы, повторно используются и как можно меньше ошибок подвержены ошибкам кодировщика. Больше всего я хочу, чтобы стиль был максимально производительным — меньше кадров в стеке — это хорошо, а также желательно меньше памяти для частично применяемых функций. Я рассмотрел 4 стиля и написал примеры ниже:
import functools
def multiplier(m):
def inner(x):
return m * x
return inner
def divide(n,d):
return n/d
def divider(d):
return functools.partial(divide,d=d)
times2 = multiplier(2)
print(times2(3)) # 6
by2 = divider(2)
print(by2(6)) # 3.0
by3 = functools.partial(divide,d=3)
print(by3(9)) # 3.0
by4 = lambda n: divide(n,4)
print(by4(12)) # 3.0
Мой анализ их:
times2
— это вложенная вещь. Я предполагаю, что python делает закрытие с привязкой m
, и все хорошо. Код читабелен (я думаю) и прост для понимания. Никаких внешних библиотек. Это стиль, который я использую сегодня.
by2
имеет явную именованную функцию, которая упрощает работу пользователя. Он использует functools, поэтому он дает вам дополнительный импорт. Мне в какой-то степени нравится этот стиль, поскольку он прозрачен, и я могу использовать divide
другими способами, если захочу. Сравните это с inner
, который недоступен.
by3
похож на by2
, но вынуждает читателя кода чувствовать себя комфортно с functools.partial
, так как он сразу бросается в глаза. что мне меньше всего нравится, так это то, что PyCharm не может дать мне всплывающие подсказки о том, какими должны быть аргументы для functools.partial
, поскольку они фактически являются аргументами для by3
. Я сам должен знать подпись divide
каждый раз, когда определяю какое-то новое частичное приложение.
by4
набирать просто, так как я могу использовать автозаполнение. Ему не нужен импорт functools
. Я думаю, что это выглядит не питоническим. Кроме того, я всегда чувствую себя некомфортно из-за области видимости переменных/замыканий с лямбда-выражениями, работающими в python. Никогда не уверен, как это себя ведет....
В чем логическая разница между стилями и как это влияет на память и ЦП?
timeit
(не думаю, что будет существенная разница) - person Yevhen Kuzmovych   schedule 06.09.2019