2015-09-29 44 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'或迭代'userEnvironments'?你不能通過生成器'生成'鍵查找,但是如果你只存儲了原始的'environment'對象,你可以*推遲創建'EnvironmentStore'。 –

+0

這太含糊。 –

+0

@ Martijn的建議也是我想到的;創建一個自定義詞典(例如'MutableMapping'子類),該詞典在設置時存儲'environment',但僅在get時創建'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的創作被推遲,直到它實際上是擡頭。如果不是所有的值都被查找到,這不僅會推遲成本,而且還會避免從未使用過的密鑰。

+0

謝謝。這與我所期待的非常接近。 – Omid