Что мне больше всего нравится в вложенных функциях, так это то, что он менее подробный, чем классы. Определение эквивалентно класс вашей функции производителя является:
class clsmaker(object):
def __init__(self, N):
self.N = N
def __call__(self, X):
return X * self.N
Это не кажется так плохо, пока вы не начнете добавлять больше аргументов конструктору. Затем, делая это, путь класса принимает дополнительную строку для каждого аргумента, а функция просто получает дополнительные аргументы.
Оказывается, что есть преимущество в скорости с вложенными функциями, а также:
>>> T1 = timeit.Timer('maker(3)(4)', 'from __main__ import maker')
>>> T1.timeit()
1.2818338871002197
>>> T2 = timeit.Timer('clsmaker(3)(4)', 'from __main__ import clsmaker')
>>> T2.timeit()
2.2137160301208496
Это может быть связано с уменьшением числа опкоды, участвующих в вложенной функции версии:
>>> dis(clsmaker.__call__)
5 0 LOAD_FAST 1 (X)
3 LOAD_FAST 0 (self)
6 LOAD_ATTR 0 (N)
9 BINARY_MULTIPLY
10 RETURN_VALUE
>>> act = maker(3)
>>> dis(act)
3 0 LOAD_FAST 0 (X)
3 LOAD_DEREF 0 (N)
6 BINARY_MULTIPLY
7 RETURN_VALUE
это существенная разница во времени..интересные результаты – meade