懒加载字典

时间:2012-06-15 08:26:40

标签: python

我在模块级别有一个名为fsdata的字典(就像一个全局变量)。

从文件系统中读取内容。它应该在第一次访问时加载一次数据。到目前为止,它在导入模块期间加载数据。这应该优化。

如果没有代码访问fsdata,则不应从文件系统中读取内容(节省CPU / IO)。

如果你检查布尔值,也应该加载:

if mymodule.fsdata:
    ... do_something()

更新:某些代码已经使用了mymodule.fsdata。我不想改变其他地方。它应该是可变的,而不是函数。并且“mymodule”需要是一个模块,因为它已经在很多代码中使用了。

3 个答案:

答案 0 :(得分:3)

我认为你应该使用像这样https://gist.github.com/2935416

的未来/承诺

要点 - 你不是创建一个对象,而是一个关于对象的'promise',它的行为就像一个对象。

答案 1 :(得分:2)

您可以使用具有描述符语义的object替换模块:

class FooModule(object):
    @property
    def bar(self):
        print "get"
import sys
sys.modules[__name__] = FooModule()

查看http://pypi.python.org/pypi/apipkg的打包方法。

答案 2 :(得分:1)

你可以创建一个记忆数据的简单函数:

fsdata = []

def get_fsdata:
    if not fsdata:
        fsdata.append(load_fsdata_from_file())
    return fsdata[0]

(我正在使用一个列表,因为这是一个简单的方法,可以创建一个全局变量而无需使用全局关键字)。

现在,您只需致电module.fsdata,而不是引用module.get_fsdata()