En resumen: ¿cuál es la forma rápida de comprobar si una enorme lista en python ha cambiado? hashlib
necesita un búfer, y construir una representación de cadena de esa lista es inviable.Comprueba si la enorme lista en python ha cambiado
En long: Tengo una ENORME lista de diccionarios que representan datos. Ejecuto varios análisis sobre estos datos, pero hay algunos aspectos de los metadatos que requieren todos los análisis, es decir. el conjunto de temas (cada dict en la lista tiene una clave de tema, y en ocasiones solo necesito una lista de todos los sujetos que tienen datos presentes en el conjunto de datos). Así que me gustaría poner en práctica lo siguiente:
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
La pregunta es cómo poner en práctica el método has_changed
, o más específicamente, get_hash
(cada objeto ya tiene un método __hash__
, pero por defecto, simplemente devuelve el objeto de id
, que no cambia cuando, por ejemplo, agregamos un elemento a una lista).
¿Cómo es tu método 'change_data'? También 'self.subjects' se puede construir como' self.subjects = set (datum ['subject'] para datum en self.data) '. – eumiro
Creo que es posible que necesite dar más detalles. ¿Tienes versiones antiguas y nuevas? ¿Puedes usar frozendicts? ¿Importa el orden? ¿Tu código está creando los cambios? – Marcin
¿Puede simplemente tener una variable de instancia 'has_changed' que establezca siempre que cambie' data'? De lo contrario, probablemente necesites un objeto proxy para delegar todo, excepto 'has_changed' en los' datos 'reales. – agf