Я в кінцевому підсумку намагався БУТИ AttrDict і Bunchбібліотеки і виявив, що це спосіб сповільнити моє використання. Після того, як ми з другом подивилися, ми виявили, що основний метод написання цих бібліотек призводить до того, що бібліотека агресивно повторюється через вкладений об'єкт і створює копії словникового об’єкта протягом усього часу. Зважаючи на це, ми внесли дві ключові зміни. 1) Ми зробили атрибути ліниво завантаженими 2) замість створення копій об’єкта словника, ми створюємо копії легкого проксі-об’єкта. Це остаточна реалізація. Підвищення продуктивності використання цього коду неймовірне. Під час використання AttrDict або Bunch, ці дві бібліотеки споживали 1/2 та 1/3 мого часу запиту (що !?). Цей код скоротив цей час майже нічого (десь в межах 0,5 мс). Це, звичайно, залежить від ваших потреб, але якщо ви використовуєте цю функцію небагато в коді,
class DictProxy(object):
def __init__(self, obj):
self.obj = obj
def __getitem__(self, key):
return wrap(self.obj[key])
def __getattr__(self, key):
try:
return wrap(getattr(self.obj, key))
except AttributeError:
try:
return self[key]
except KeyError:
raise AttributeError(key)
# you probably also want to proxy important list properties along like
# items(), iteritems() and __len__
class ListProxy(object):
def __init__(self, obj):
self.obj = obj
def __getitem__(self, key):
return wrap(self.obj[key])
# you probably also want to proxy important list properties along like
# __iter__ and __len__
def wrap(value):
if isinstance(value, dict):
return DictProxy(value)
if isinstance(value, (tuple, list)):
return ListProxy(value)
return value
Дивіться оригінальну реалізацію тут за посиланням https://stackoverflow.com/users/704327/michael-merickel .
Інша річ, що слід зазначити, це те, що ця реалізація є досить простою і не реалізує всі методи, які вам можуть знадобитися. Вам потрібно буде записати такі, як потрібно, на об'єкти DictProxy або ListProxy.
d[a][b][c]
їх замінюютьd[a, b, c]
.