Вкратце: как быстро проверить, не изменился ли огромный список в питоне? 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
объекта, который не меняется, когда мы, например, добавляем элемент в список).