简短地说:在Python中,检查一个巨大列表是否发生了改变的最快方法是什么?使用hashlib需要一个缓冲区,而构建该列表的字符串表示形式是不可行的。
长话短说:我有一个包含数据的巨大字典列表。我对这些数据进行了许多分析,但有一些元数据方面是所有分析都必需的,即受试者集合(列表中每个字典都有一个主题键,并且有时我只需要数据集中所有具有数据的主题列表)。所以我想要实现以下内容:
问题在于如何实现
长话短说:我有一个包含数据的巨大字典列表。我对这些数据进行了许多分析,但有一些元数据方面是所有分析都必需的,即受试者集合(列表中每个字典都有一个主题键,并且有时我只需要数据集中所有具有数据的主题列表)。所以我想要实现以下内容:
class Data:
def __init__(self, ...):
self.data = [{...}, {...}, ...] # long ass list of dicts
self.subjects = set()
self.hash = 0
def get_subjects(self):
# recalculate set of subjects only if necessary
if self.has_changed():
set(datum['subject'] for datum in self.data)
return self.subjects
def has_changed(self):
# calculate hash of self.data
hash = self.data.get_hash() # HOW TO DO THIS?
changed = self.hash == hash
self.hash = hash # reset last remembered hash
return changed
问题在于如何实现
has_changed
方法,或更具体地说,get_hash
方法(每个对象已经有一个__hash__
方法,但默认情况下它只返回对象的id
,当我们向列表中添加元素时,该值不会改变)。
change_data
方法是什么样子的?另外,self.subjects
可以这样构建:self.subjects = set(datum['subject'] for datum in self.data)
。 - eumirohas_changed
实例变量,每当你更改data
时设置它。否则,你可能需要一个代理对象来委托除了has_changed
之外的所有操作给真正的data
。 - agf