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

问题描述 投票:1回答:1

假设我有一个数据框,我通过加载一个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()结果,所以它不会对性能产生任何影响......

python
1个回答
1
投票

当我用其他方法调用self.df时,每次都会调用get_dataframe吗?

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

沿着相同的路线,B2将比B更高效,因为它将方法的结果缓存在__init__中的实例属性中。

© www.soinside.com 2019 - 2024. All rights reserved.