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已经发布了一个实现。谢谢。这离我要找的东西太近了。