【发布时间】:2017-04-03 14:08:00
【问题描述】:
我来自 C++ 背景,并且经常使用静态变量来减少必须初始化变量的时间(特别是如果初始化需要很长时间)。因此,从 StackOverflow 上的其他帖子中,人们建议使用静态类变量,如下所示:
class MyClass(object):
StaticList1 = [...] # Very large list
StaticList2 = [...] # Very large list
如果在整个程序执行过程中至少存在 1 个 MyClass 实例并且列表只创建一次,这很好。但是,如果在执行的某个阶段没有 MyClass 的实例,Python 似乎会删除静态列表(我假设是因为引用计数器下降到 0)。
所以我的问题是,是否有任何简单的方法不使用外部模块来初始化 StaticList1 和 StaticList2 一次(第一次使用它们)并且即使在程序存在之前没有 MyClass 实例也永远不要删除它们(或您手动删除列表)?
编辑:
也许我把这个问题简单化了。我在做什么:
class MyClass(object):
StaticList = None
def __init__(self, info):
if self.StaticList == None:
print "Initializing ..."
self.StaticList = []
# Computationally expensive task to add elements to self.StaticList, depending on the value of parameter info
def data(self):
return self.StaticList
我从另一个脚本导入模块并有这样的循环:
import myclass
for i in range(10000):
m = myclass.MyClass(i)
d = m.data()
# Do something with d.
静态列表的初始化大约需要 200 - 300 毫秒,并且在循环的每次迭代中执行,因此循环需要很长时间才能完成。
【问题讨论】:
-
您可以利用模块是单例的这一事实,因此如果您创建这些模块级成员,只要模块被导入,它们就会一直存在并且只会存在一次。
-
这听起来不对,我不希望这些列表会去任何地方。你是说你打电话给
MyClass.StaticList1 ...,你得到一个错误?你遇到了什么错误? -
* 但是,如果在执行的某个阶段没有 MyClass 的实例,Python 似乎删除了静态列表* AFAIK,这是错误的。该类将独立于该类的对象而存在,并且在类级别定义的所有属性将继续通过该类存在。你能举例说明你的问题吗?
-
如果每次调用构造函数/__init__ 时都会清除并重新计算静态变量。然后我不明白为什么它在 C++ 或 Python 中应该是静态的,它只是需要在循环的每次迭代中完成的工作。可能大部分工作都发生在
# Computationally expensive task...线上,而你是如何做到的,你没有展示出来。