我有一个迭代器( userEnvironments
),其中包含许多用户环境对象,我想要创建一个包含 environment.name
的字典。作为 key 和新的 EnvironmentStore
将使用 environment
的对象.
for environment in userEnvironments:
set_cache(user,environment)
def set_cache(user, environment):
_environments_cache[environment.name] = EnvironmentStore(user, environment)
内存效率在这里并不重要,但创建所有这些对象大约需要 4 秒。
所以问题是,Python 中类似于生成器的好方法是什么,可以仅按需创建对象(例如,当另一个方法想要调用该类时创建对象)?
最佳答案
如果创建 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
值都被查找过,这不仅会推迟成本,而且会完全避免那些从未使用过的键的成本。
关于python - 从大量对象中创建对象的最优化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32844112/