python namedtuple memory

Jan 14, 2015 23:42

В питоне есть namedtuple, тупл к полям которого можно обращаться привычным синтаксисом object.field

namedtuple лучше обычных туплов тем, что к полям тупла можно обращаться по имени, легко добавлять к типу новые поля и удалять.
namedtuple лучше словарей/объектов тем, что не расходуют память на имена полей в каждом объекте.

Использование такое:
Read more... )

soft-dev, python

Leave a comment

Comments 3

gegmopo4 January 14 2015, 21:09:14 UTC
Ещё есть __slots__. А c 3.4 и в обычном классе память на имена полей в каждом объекте не расходуется, если поля проинициализированы в конструкторе. Это, конечно, не так экономно, как namedtuple, зато в довесок не идёт паразитный протокол.

Самый же экономный способ - запаковать поля в целое.

class Point(int): # long в Python 2
def __new__(cls, x, y):
assert 0 <= x < 2**32
assert 0 <= y < 2**32
return int.__new__(cls, (x << 32) + y)
@property
def x(self):
return self >> 32
@property
def y(self):
return self & (2**32 - 1)
def __repr__(self):
return '%s(%r, %r)' % (self.__class__.__name__, self.x, self.y)
__str__ = __repr__

Reply

spiiin January 14 2015, 21:37:12 UTC
о, удобный способ. и в качестве быстрого использования в интерпретаторе годится.

Reply


kodt_rsdn January 14 2015, 21:49:07 UTC
Век живи, век учись.
А я раньше велосипедил примерно так

class AdHoc:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def __str__(self):
return repr(self)
def __repr__(self):
return 'AdHoc(%s)' % (
', '.join(
'%s=%r' % kv for kv in self.__dict__.items()
)
)

p = AdHoc(x=1, y=2, z='hello')
print(p.x, p.y, p.z) # 1 2 hello
print(p) # AdHoc(x=1, y=2, z='hello') -- порядок может не сохраниться, кстати
p.t = None # атрибуты можно добавлять по ходу пьесы
print(p) # AdHoc(x=1, y=2, z='hello', t=None)
p.t = p
print(p) # исчерпание стека :)))
del p.t # удалять атрибуты тоже можно
print(p) # AdHoc(x=1, y=2, z='hello')

Но вот идея генерировать класс с заданными полями - это симпатично.

Reply


Leave a comment

Up