Python 从大量对象中创建对象的最佳方式
我有一个迭代器(Python 从大量对象中创建对象的最佳方式,python,object,iterator,generator,Python,Object,Iterator,Generator,我有一个迭代器(userEnvironments),其中包含许多用户环境对象,我希望创建一个字典,其中包含environment.name作为键和一个新的EnvironmentStore对象,该对象将使用environment for environment in userEnvironments: set_cache(user,environment) def set_cache(user, environment): _environments_cache[en
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中有什么好方法可以像生成器一样只按需创建对象(如,当另一个方法想要调用类时创建对象?如果创建
环境存储()
实例是此处的时间接收器。您可以使用自定义映射推迟创建这些实例:
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
值,这不仅会推迟成本,而且会完全避免那些从未使用过的密钥的成本。在这里花时间做什么,创建EnvironmentStore
或迭代userEnvironments
?您不能在生成器上“生成”键查找,但如果只存储原始的环境
对象,则可以推迟创建环境存储
。@Martijn的建议也是我想到的;创建一个自定义字典(例如,MutableMapping
子类),该字典在集合中存储环境
,但仅在get时使用它构建环境存储
(您可以缓存后者,因此只构建一次)。@MartijnPieters创建环境存储
由于其结构,需要更多的时间。因此,我想更改我的代码,以便按需创建EnvironmentStore
,而不是一次创建所有内容。您是否考虑过制作一个自定义的惰性字典,当您通过overriding getitem方法按键请求值时,它会自动生成?@Omid我的意思是将environment
存储在字典中,而不是环境存储
,然后仅在访问字典时创建后者。Martijn已经发布了一个实现。谢谢。这离我要找的东西太近了。