从大量对象中创建对象的最佳方式

2024-09-28 22:36:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个迭代器(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中,有什么好的方法可以像生成器一样只按需创建对象(比如,当另一个方法要调用类时创建对象)?你知道吗


Tags: 对象方法用户nameincachefor字典
1条回答
网友
1楼 · 发布于 2024-09-28 22:36:48

如果创建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值都被查找过,这不仅会推迟开销,而且会完全避免那些从未使用过的键。你知道吗

相关问题 更多 >