Подтвердить что ты не робот

Классы или замыкания для простых вещей в Python

Я хотел бы узнать больше о функциях "с памятью", реализованных как классы vs закрытия.

Рассмотрим (очень) простой пример:

def constant(value):
    def _inner():
        return value
    return _inner
x = constant(5)
print(x())

против.

class Constant():
    def __init__(self, value):
        self._value = value

    def __call__(self):
        return self._value
y = Constant(5)
print(y()) 

Лучше ли производительность и потребление памяти? Использование слотов сделает класс более эффективным?

Спасибо,

Хернан

Ps.- Я знаю, что в этом чрезвычайно простом примере, вероятно, это не имеет значения. Но меня интересуют более сложные функции, которые будут называться большим количеством раз или которые будут создаваться многократно.

4b9b3361

Ответ 1

В Python 2.6 я получаю следующее:

def foo(x):
    def bar():
        return x
    return bar

b = foo(4)
b.__sizeof__()
>>> 44

Но используя класс:

class foo(object):
    def __init__(self,x):
        self.x = x
    def __call__(self):
        return self.x

c = foo(4)
c.__sizeof__()
>>> 16

Похоже, что функциональная версия - это больший объем памяти.

Ответ 2

Я бы написал более сложные функции и профилировал их.

Ответ 3

Если вам нужна производительность и требуется только доступ к значениям, то лучше всего использовать встроенный тип данных, например кортеж для лучшей производительности