我正在使用composition方法创建一个包含pandas框架的类,如下所示。我正在通过对基列进行一些操作来创建derived
属性。
import numpy as np
import pandas as pd
class myclass:
def __init__(self, *args, **kwargs):
self.df = pd.DataFrame(*args, **kwargs)
@property
def derived(self):
return self.df.sum(axis=1)
myobj = myclass(np.random.randint(100, size=(100,6)))
d = mc.derived
字符串derived
的计算是一个昂贵的步骤,因此我想缓存这个函数。我想使用functools.lru_cache
同样。但是,它需要原始对象被哈希。我试图为这个对象创建一个__hash__
函数,详细说明在这个答案https://stackoverflow.com/a/47800021/3679377中。
现在我遇到了一个新的问题,哈希函数是一个昂贵的步骤!.有什么方法可以解决这个问题?或者我已经走到了死胡同?
有没有更好的方法来检查一个嵌套框架是否被修改过,如果没有,就继续返回相同的哈希值?
3条答案
按热度按时间4urapxun1#
如果散列不起作用,你可以尝试利用类的内部状态。
缓存一个方法
使用类属性作为缓存:在第一次调用方法时,将结果存储到该属性中,并在后续调用时检索它。
字符串
缓存多个方法
然后你可以将这个原则扩展到几种方法,使用
dict
来存储每个操作的结果。你可以使用方法名称作为这个dict的键(感谢模块inspect,参见this response的示例)。型
您可以因式分解这两个属性的主体以遵守DRY原则,但一定要相应地修改
_get_method_name
。lxkprmvk2#
如果你知道哪些方法可能会更新你的df,你可以在你的自定义类中覆盖它们,并保留一个标志。我不会在这里详细介绍,但这里是基本原则:
字符串
可能有一个更深层次的DataFrame或pandas方法,它会在DataFrame内容的每次更改时调用,我会继续寻找。
但是你可以设置一个你的程序将使用的方法列表,并制作一个装饰器来做我在
update
中所做的事情,并在列出的每个方法上调用它。nmpmafwu3#
这个问题是Google搜索如何散列DataFrame的结果之一。
对于示例代码中的用例,缓存结果是最好的方法,正如efont的回答中所指出的。
要回答有关如何对DataFrame进行散列并解决“散列函数是一个代价高昂的步骤”这一事实的字面问题,请参见RokoMijic的this answer:
字符串
Here是
pd.util.hash_pandas_object()
的参考。