Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python是缓存实例变量还是每次调用时都计算它们_Python - Fatal编程技术网

python是缓存实例变量还是每次调用时都计算它们

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

假设我有一个数据帧,我通过加载一个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\u dataframe
get 每次都打电话

否,因为
self.df
是在对象实例化时计算的。之后,对
self.df
的后续引用将只查询它引用的值,而不会重复调用该方法。(提示:您可以通过在此处或此处添加两条打印语句来确认这一点。)


按照同样的思路,
B2
B
性能更好,因为它将方法的结果缓存在
\uuuuuu init\uuuuuu

中的实例属性中。不,它完全不假设您的代码和数据。一切都重新运行。如果不太可能更改,为什么不将其作为属性?@cᴏʟᴅsᴘᴇᴇᴅ 所以B()和B2()在性能上没有区别,或者你指的是A()?啊,对不起。我只是看着B。在B2的情况下,调用函数一次,并将结果存储在实例属性中。因此,当您参考
self.labels
时,不会再次调用该方法,只查询变量的值。我想这更有效。@cᴏʟᴅsᴘᴇᴇᴅ 好的,那么对于()函数只调用一次,因为我们将结果存储在实例属性中?好啊