2015-09-29 3 views
1

У меня есть итератор (userEnvironments), который содержит много объектов пользовательской среды, которые я хочу для создания словаря, содержащего environment.name, в качестве ключа и нового объекта EnvironmentStore, который будет использовать environment.Самый оптимизированный способ создания объектов из огромного набора объектов

for environment in userEnvironments: 
     set_cache(user,environment) 

def set_cache(user, environment): 
     _environments_cache[environment.name] = EnvironmentStore(user, environment) 

Эффективность памяти здесь не важна, но создание всех этих объектов займет примерно 4 секунды.

Итак, вопрос в том, что было бы хорошим подходом в python, который мог бы создавать объекты только по требованию (как в, создает объекты, когда другой метод хочет вызвать класс), подобный генератору?

+1

Что здесь занимает время, создавая «EnvironmentStore» или итерируя «пользовательские среды»? Вы не можете генерировать ключевые поисковые запросы по генератору, но вы * можете * отложить создание «EnvironmentStore», если вы только сохранили исходный объект «среда». –

+0

Это слишком расплывчато. –

+0

@ Предложение Martijn тоже пришло мне в голову; создайте пользовательский словарь (например, подкласс MutableMapping), который хранит «среду» в наборе, но строит «EnvironmentStore» с ним только при получении (вы можете кэшировать последний, так что он создается только один раз). – jonrsharpe

ответ

2

Если создание EnvironmentStore() экземпляров время раковина здесь вы можете отложить создание этого с помощью настраиваемого отображения:

from collections import Mapping 

class EnvironmentStoreMapping(Mapping): 
    def __init__(self, user, environments): 
     self._user = user 
     self._envs = {env.name: env for env in environments} 
     self._cache = {} 

    def __getitem__(self, key): 
     try: 
      return self._cache[key] 
     except KeyError: 
      store = EnvironmentStore(self._user, self._envs[key]) 
      self._cache[key] = store 
      return store 

    def __iter__(self): 
     return iter(self._envs) 

    def __len__(self): 
     return len(self._envs) 

    def __contains__(self, key): 
     return key in self._envs 

_environments_cache = EnvironmentStoreMapping(user, userEnvironments) 

Теперь создание EnvironmentStore откладывается до тех пор, пока не будет на самом деле посмотрели вверх. Если не все значения env.name всегда будут подняты, это не только отложит стоимость, но и полностью избежит этих ключей, которые никогда не использовались.

+0

Спасибо. Это так близко к тому, что я искал. – Omid

Смежные вопросы