मुझे यह क्यू/ए बहुत दिलचस्प लगता है, क्योंकि यह एक ही समस्या के लिए कई अलग-अलग समाधान प्रदान करता है। मैंने इन सभी कार्यों को लिया और उन्हें एक जटिल शब्दकोश वस्तु के साथ परीक्षण किया। मुझे परीक्षण से दो कार्य करना पड़ता था, क्योंकि उन्हें कई असफल परिणाम होते थे और वे मूल्यों के रूप में लौटने वाली सूचियों या डिक्ट्स का समर्थन नहीं करते थे, जो मुझे आवश्यक लगता है, क्योंकि लगभग किसी भी डेटा के लिए एक फ़ंक्शन तैयार किया जाना चाहिए।
तो मैं timeit
मॉड्यूल के माध्यम से 100,000 पुनरावृत्तियों में अन्य कार्यों पंप और आउटपुट निम्न परिणाम के लिए आया था:
0.11 usec/pass on gen_dict_extract(k,o)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6.03 usec/pass on find_all_items(k,o)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0.15 usec/pass on findkeys(k,o)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1.79 usec/pass on get_recursively(k,o)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0.14 usec/pass on find(k,o)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0.36 usec/pass on dict_extract(k,o)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
सभी कार्यों ('प्रवेश') और एक ही शब्दकोश वस्तु के लिए खोज करने के लिए एक ही सुई था , जिसे इस तरह बनाया गया है:
o = { 'temparature': '50',
'logging': {
'handlers': {
'console': {
'formatter': 'simple',
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout',
'level': 'DEBUG'
}
},
'loggers': {
'simpleExample': {
'handlers': ['console'],
'propagate': 'no',
'level': 'INFO'
},
'root': {
'handlers': ['console'],
'level': 'DEBUG'
}
},
'version': '1',
'formatters': {
'simple': {
'datefmt': "'%Y-%m-%d %H:%M:%S'",
'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
}
}
},
'treatment': {'second': 5, 'last': 4, 'first': 4},
'treatment_plan': [[4, 5, 4], [4, 5, 4], [5, 5, 5]]
}
सभी कार्यों ने एक ही परिणाम दिया, लेकिन समय अंतर नाटकीय हैं!फ़ंक्शन gen_dict_extract(k,o)
मेरा फ़ंक्शन यहां फ़ंक्शंस से अनुकूलित किया गया है, वास्तव में यह मुख्य अंतर के साथ find
फ़ंक्शन एल्फ़ से बहुत अधिक है, कि मैं जांच कर रहा हूं कि दिए गए ऑब्जेक्ट में इटिरिटैम फ़ंक्शन है, यदि स्ट्रिंग के दौरान स्ट्रिंग पास हो जाती है:
def gen_dict_extract(key, var):
if hasattr(var,'iteritems'):
for k, v in var.iteritems():
if k == key:
yield v
if isinstance(v, dict):
for result in gen_dict_extract(key, v):
yield result
elif isinstance(v, list):
for d in v:
for result in gen_dict_extract(key, d):
yield result
तो यह संस्करण यहां कार्यों का सबसे तेज़ और सुरक्षित है। और find_all_items
अविश्वसनीय रूप से धीमा है और दूसरे धीमे get_recursivley
से दूर है जबकि बाकी, dict_extract
को छोड़कर, एक-दूसरे के करीब है। फ़ंक्शन fun
और keyHole
केवल तभी काम करते हैं जब आप स्ट्रिंग की तलाश में हैं।
दिलचस्प सीखने का पहलू :)
क्या यह 'JSON' के साथ है? – hochl
@ होचल की तरह, यह एक मोंगोड डेटाबेस से है, जो बीएसओएन से एक पायथन 'dict' और' सूचियों 'में pymongo द्वारा पार्स किया गया है। –
** यह भी देखें: ** https://stackoverflow.com/questions/7681301/search-for-a-key-in-a-nested-python-dictionary https://stackoverflow.com/a/16508328/42223 – dreftymac