このQ / Aは、同じ問題に対していくつかの異なる解決策を提供するため、非常に興味深いと思いました。私はこれらすべての関数を取り、複雑な辞書オブジェクトでテストしました。2つの関数をテストから除外する必要がありました。これは、多くの失敗結果が必要であり、リストまたはdictを値として返すことをサポートしていなかったためです。これは、関数がほぼすべてのデータに対して準備される必要があるためです。
そのため、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)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
すべての関数には、検索するための同じ針( '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の関数とほとんど同じですが、主な違いは、再帰中に文字列が渡された場合に、指定されたオブジェクトにiteitems関数があるかどうかを確認することです。
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
、信じられないほど遅く、2番目に遅いものから遠く離れていますがget_recursivley
、残りは、を除いてdict_extract
、互いに近くにあります。機能fun
とkeyHole
唯一の仕事は、あなたは、文字列を探している場合。
ここで興味深い学習の側面:)