मुझे यह क्यू / ए बहुत दिलचस्प लगा, क्योंकि यह एक ही समस्या के लिए कई अलग-अलग समाधान प्रदान करता है। मैंने इन सभी कार्यों को लिया और एक जटिल शब्दकोश वस्तु के साथ उनका परीक्षण किया। मुझे परीक्षण से दो कार्य लेने थे, क्योंकि उनके कई असफल परिणाम थे और उन्होंने मान के रूप में सूची या डाइक को वापस करने का समर्थन नहीं किया था, जो मुझे आवश्यक लगता है, क्योंकि किसी भी डेटा के आने के लिए एक फ़ंक्शन तैयार किया जाना चाहिए ।
इसलिए मैंने 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
केवल तभी काम करते हैं जब आप तार की तलाश कर रहे हों।
दिलचस्प सीखने का पहलू :)