
我发现此Q /
A非常有趣,因为它为同一问题提供了几种不同的解决方案。我采用了所有这些功能,并使用一个复杂的字典对象对其进行了测试。我必须从测试中删除两个函数,因为它们必须有很多失败结果,并且它们不支持将返回列表或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)- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
所有函数都使用相同的指针进行搜索(“记录”)和相同的字典对象,其结构如下:
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唯一的工作,如果你正在寻找的字符串。
这里有趣的学习方面:)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)