假设我有一个数据框,我通过加载一个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()
结果,因此它不会对性能产生任何影响......
答案 0 :(得分:1)
当我在其他方法中调用
self.df
时,get_dataframe
会得到 每次都打电话?
不,因为在对象实例化时评估self.df
。之后,对self.df
的后续引用将仅查询它引用的值,并且不会重复调用该方法。 (提示:你可以通过在这里和那里添加几个打印语句来确认这一点。)
同样,B2
比B
更高效,因为它将方法的结果缓存在__init__
中的实例属性中。