python是缓存实例变量还是每次调用时都计算它们
假设我有一个数据帧,我通过加载一个json文件来填充它,然后对该文件进行一些操作等。当我在其他方法中调用python是缓存实例变量还是每次调用时都计算它们,python,Python,假设我有一个数据帧,我通过加载一个json文件来填充它,然后对该文件进行一些操作等。当我在其他方法中调用self.df时,get_dataframe是否每次都被调用?或者它是对象的一部分并被缓存 import pandas as pd import json class A(): def __init__(self): self.df = self.get_dataframe() def get_dataframe(self): # is this called every
self.df
时,get_dataframe
是否每次都被调用?或者它是对象的一部分并被缓存
import pandas as pd
import json
class A():
def __init__(self):
self.df = self.get_dataframe()
def get_dataframe(self): # is this called every time?
data = json.load(open('filename'))
dict = self.prepare_json(data)
df = pd.DataFrame(dict)
return df
def use_df(self):
self.df["new_column"] = ..
def use_df2(self):
self.df.plot()...
作为第二个问题。我还想知道我每次调用get_labels方法的这两个类与我将标签存储为实例属性的这两个类之间的性能是否有差异:
class B():
def get_labels(self):
labels = ..
return labels
def use_labels(self):
labels = self.get_labels()
# use labels here
def use_labels2(self):
labels = self.get_labels()
# use labels here
class B2():
def __init__(self):
self.labels = self.get_labels()
def get_labels(self):
labels = ..
return labels
def use_labels(self):
labels = self.labels
# use labels here
def use_labels2(self):
labels = self.labels
# use labels here
我想知道python是否会缓存get_labels()
结果,这样就不会对性能造成任何影响
当我用其他方法调用self.df
时,get\u dataframe
get
每次都打电话
否,因为self.df
是在对象实例化时计算的。之后,对self.df
的后续引用将只查询它引用的值,而不会重复调用该方法。(提示:您可以通过在此处或此处添加两条打印语句来确认这一点。)
按照同样的思路,
B2
比B
性能更好,因为它将方法的结果缓存在\uuuuuu init\uuuuuu中的实例属性中。不,它完全不假设您的代码和数据。一切都重新运行。如果不太可能更改,为什么不将其作为属性?@cᴏʟᴅsᴘᴇᴇᴅ 所以B()和B2()在性能上没有区别,或者你指的是A()?啊,对不起。我只是看着B。在B2的情况下,调用函数一次,并将结果存储在实例属性中。因此,当您参考self.labels
时,不会再次调用该方法,只查询变量的值。我想这更有效。@cᴏʟᴅsᴘᴇᴇᴅ 好的,那么对于()函数只调用一次,因为我们将结果存储在实例属性中?好啊