이 Q / A는 동일한 문제에 대해 여러 가지 다른 솔루션을 제공하기 때문에 매우 흥미로 웠습니다. 이 모든 기능을 가져 와서 복잡한 사전 객체로 테스트했습니다. 많은 실패 결과를 가져야하고 거의 모든 데이터에 대해 함수를 준비해야하므로 필수라고 생각하는 값으로 목록이나 사전을 반환하는 것을 지원하지 않았기 때문에 테스트에서 두 가지 함수를 제거해야했습니다 .
그래서 나는 timeit
모듈을 통해 10,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)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
모든 함수에는 검색 할 동일한 바늘 ( 'logging')과 동일한 사전 객체가 있으며 다음과 같이 구성됩니다.
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
Alfe 의 함수 와 거의 비슷 하지만, 재귀 중에 문자열이 전달되는 경우 주어진 객체에 iteritems 함수가 있는지 확인하고 있습니다.
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
유일한 작업은 문자열을 찾고 있다면.
흥미로운 학습 측면 :)