最优化的方法,用于从大量对象创建对象

时间:2015-09-29 12:31:48

标签: python object iterator generator

我有一个迭代器(environment.name),其中包含许多用户环境对象,我想创建一个包含EnvironmentStore作为键的字典和一个将使用的新environment对象for environment in userEnvironments: set_cache(user,environment) def set_cache(user, environment): _environments_cache[environment.name] = EnvironmentStore(user, environment)

var test = jQuery('#wpsight-listing-details-3 .span4:nth-child(4) .listing-details-value').html();

var partsOfStr = test.split(',');

alert(partsOfStr);

此处的内存效率并不重要,但创建所有这些对象大约需要4秒钟。

所以问题是,在python中什么是一个好的方法,只能按需创建对象(比如,在另一个方法想要调用类时创建对象)类似于生成器?

1 个答案:

答案 0 :(得分:2)

如果创建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值都被查找过,这不仅会推迟成本,而且会完全避免使用从未使用过的密钥。