당신은 사용자 정의 클래스를 만들 수 DO 밝혀 아마도 사용 된 메모리 :
class MutableEfficientNamedList(object):
__slots__ = ('field1', 'field2', 'field3')
def __init__(self, *values):
for k, v in zip(self.__slots__, values):
setattr(self, k, v)
def __getitem__(self, i):
return getattr(self, self.__slots__[i])
def __setitem__(self, i, v):
return setattr(self, self.__slots__[i], v)
def __repr__(self):
return '{}({})'.format(type(self).__name__,
', '.join(repr(getattr(self, s)) for s in self.__slots__))
그런 다음 구조에있는 것을 사용하십시오. 그것들은 명명 된 튜플처럼 사용할 수 있습니다 (이름으로 인덱스 및에 의한 액세스를 허용하지만). __slots__
를 사용하여 각 인스턴스의 메모리 풋 프린트는 낮게 유지 : 물론
>>> menl = MutableEfficientNamedList('foo', 'bar', 'baz')
>>> menl
MutableEfficientNamedList('foo', 'bar', 'baz')
>>> menl.field1
'foo'
>>> menl[0]
'foo'
>>> menl[1]
'bar'
>>> menl[1] = 'spam'
>>> menl.field2
'spam'
당신은 슬롯 의미있는 이름을주고, 내가 예에서 사용 된 것보다 당신의 클래스에 대한 더 나은 이름을 선택 바랍니다.
def namedlist(name, *attrs):
"""Create a named list class named `name` with attributes `attrs`.
`attrs` must be strings representing valid Python identifiers.
"""
class MutableEfficientNamedList(object):
__slots__ = attrs
def __init__(self, *values):
for k, v in zip(self.__slots__, values):
setattr(self, k, v)
def __getitem__(self, i):
return getattr(self, self.__slots__[i])
def __setitem__(self, i, v):
return setattr(self, self.__slots__[i], v)
def __repr__(self):
return '{}({})'.format(type(self).__name__,
', '.join(repr(getattr(self, s)) for s in self.__slots__))
MutableEfficientNamedList.__name__ = name
return MutableEfficientNamedList
MyList = namedlist('MyList', 'foo', 'bar', 'baz')
nl = MyList(1, 2, 3)
print nl # MyList(1, 2, 3)
print nl.bar # 2
print nl[1] # 2
는 내가 제대로 질문을 이해한다면이 가능 모르겠어요. 'dict'와 같은 변경 가능한 객체는 사전 키가 될 수 없습니다. – millimoose
어쨌든, 당신이 성취하고자하는 것은 분명하지 않습니다. 이 데이터 구조가 "절충 적"으로 구축되는 방법에 대한 예를 보여줄 수 있습니까? 나는. 주어진 단일 업데이트에 대한 이전 및 이후 상태? – millimoose
내가 이해할 수 있을지 모르겠다. 어디에서 dicts가 키로서 기능 할 것이라고 제안 했는가? – phistakis