Классы или замыкания для простых вещей в Python - PullRequest
19 голосов
/ 25 марта 2011

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

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

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

Ответы [ 3 ]

8 голосов
/ 25 марта 2011

В 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

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

3 голосов
/ 25 марта 2011

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

0 голосов
/ 20 мая 2011

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

...