假设我有一个数据框,我通过加载一个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 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_dataframe
吗?
不,因为self.df
是在对象实例化时进行评估的。之后,对self.df
的后续引用将仅查询它引用的值,并且不会重复调用该方法。 (提示:你可以通过在这里和那里添加几个打印语句来确认这一点。)
沿着相同的路线,B2
将比B
更高效,因为它将方法的结果缓存在__init__
中的实例属性中。