संक्षेप में: यह जांचने का सबसे तेज़ तरीका क्या है कि पाइथन में एक बड़ी सूची बदल गई है या नहीं? 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.data में डेटाम के लिए' self.subjects = set (डेटाम ['विषय'] के रूप में बनाया जा सकता है)। – eumiro
मुझे लगता है कि आपको कुछ और विवरण देने की आवश्यकता हो सकती है। क्या आपके पास पुराने और नए संस्करण हैं? क्या आप जमे हुए लोगों का उपयोग कर सकते हैं? क्या मामला मायने रखता है? क्या आपका कोड परिवर्तन कर रहा है? – Marcin
क्या आपके पास अभी भी 'have_changed' इंस्टेंस वैरिएबल हो सकता है जब भी आप 'डेटा' बदलते हैं? अन्यथा, आपको शायद सबकुछ का प्रतिनिधित्व करने के लिए प्रॉक्सी ऑब्जेक्ट की आवश्यकता है, लेकिन वास्तविक 'डेटा' में 'has_changed' है। – agf