我在模块级别有一个名为fsdata
的字典(就像一个全局变量)。
从文件系统中读取内容。它应该在第一次访问时加载一次数据。到目前为止,它在导入模块期间加载数据。这应该优化。
如果没有代码访问fsdata
,则不应从文件系统中读取内容(节省CPU / IO)。
如果你检查布尔值,也应该加载:
if mymodule.fsdata:
... do_something()
更新:某些代码已经使用了mymodule.fsdata。我不想改变其他地方。它应该是可变的,而不是函数。并且“mymodule”需要是一个模块,因为它已经在很多代码中使用了。
答案 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()
答案 2 :(得分:1)
你可以创建一个记忆数据的简单函数:
fsdata = []
def get_fsdata:
if not fsdata:
fsdata.append(load_fsdata_from_file())
return fsdata[0]
(我正在使用一个列表,因为这是一个简单的方法,可以创建一个全局变量而无需使用全局关键字)。
现在,您只需致电module.fsdata
,而不是引用module.get_fsdata()
。