python - 从大量对象中创建对象的最优化方法

标签 python object iterator generator

我有一个迭代器( 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/

相关文章:

python - 如何使用相对导入将 python 脚本拆分为多个文件?

python - 不是 pcap 捕获文件(坏魔法)-scapy python

python - AWS Lambda 上的单元测试

Android保存自定义对象数组

c++ - 列表迭代器在C++中查找函数错误

python - for 循环仅在 __str__ 语句期间迭代到 NoneType?

python - 如何将三元组 DataFrame 转换为没有重复行的新 DataFrame?

C++ 在文件中存储对象

Java 到 Cpp 代码转换,有关 static 和 new 关键字的问题

python - 使用 Python Bottle 生成项目不起作用