python是否缓存实例变量,或者每次调用它们时都会计算它们

时间:2018-03-06 10:52:32

标签: 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 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()结果,因此它不会对性能产生任何影响......

1 个答案:

答案 0 :(得分:1)

  

当我在其他方法中调用self.df时,get_dataframe会得到   每次都打电话?

不,因为在对象实例化时评估self.df。之后,对self.df的后续引用将仅查询它引用的值,并且不会重复调用该方法。 (提示:你可以通过在这里和那里添加几个打印语句来确认这一点。)

同样,B2B更高效,因为它将方法的结果缓存在__init__中的实例属性中。