我来自C++背景,经常使用静态VARS来减少时间变量的数量(特别是初始化时间过长)。所以在StackOverflow上的其他帖子中,人们建议使用静态类变量如下:
class MyClass(object):
StaticList1 = [...] # Very large list
StaticList2 = [...] # Very large list
现在,如果在整个程序的执行过程中至少存在一个MyClass实例,并且列表只创建一次,那么就可以了。但是,如果在执行的某个阶段没有MyClass的实例,Python似乎会删除静态列表(我假设是因为引用计数器降为0)。在
所以我的问题是,有没有什么简单的方法不使用外部模块来初始化StaticList1和StaticList2一次(第一次使用它们),即使没有MyClass实例,也不删除它们,直到程序存在(或者手动删除列表)?在
编辑:
也许我把这个问题简单化了。我在做什么:
^{pr2}$我从另一个脚本导入模块,并有一个如下循环:
import myclass
for i in range(10000):
m = myclass.MyClass(i)
d = m.data()
# Do something with d.
静态列表的初始化大约需要200-300毫秒,并且在循环的每次迭代中都会执行,因此循环需要非常长的时间才能完成。在
虽然您的类确实有一个名为
StaticList
的静态字段,但实际上您正在初始化并使用同名的实例字段,因为您使用的是self
限定符。我认为如果您使用MyClass.StaticList
来初始化并访问它,您的代码将可以正常工作。在一般来说,通过Python的名称查找,您可以通过一个实例访问一个类字段,就像它是该实例上的一个实例字段一样(例如,}仍将引用您的类值)。在
self.StaticList
),只要您没有在该实例上实际设置一个同名的实例字段。从那一刻起,实例字段会隐藏class字段(即,self.StaticList
将找到您的新值,而{作为口译员的新例子:
实例变量
a.v
最初等于A.v
,但是通过显式地设置a.v=7
,就可以在该实例中“取消”它们的关联。在虽然这意味着,原则上,您可以使用一个静态类字段},但对于这种混淆,这通常是不可取的。在
MyClass.Values
以及同名的实例字段{作为一个单独的注释,您可以考虑将
data
方法注释为@staticmethod
(并在移动过程中删除self
参数),并将其称为MyClass.data()
,这样可以更清楚地表明,每次调用都会返回相同的list实例。在相关问题 更多 >
编程相关推荐