Python 提高查找dict的key的效率?

clipboard.png

现在我需要将其中h_bzmc开头的所有信息提取出来,我用的是这个办法:

ip_info=json.loads(r.text)
l = []
for k, v in ip_info['data'].items():
    if k.startswith('h_bzmc'):
            l.append(ip_info['data'][k])

这样在key很多的情况下速度是否会受到较大影响?是否有效率更高的方法呢?

阅读 9.4k
5 个回答

按照python官方的说法是直接for key in dict这种方式查找key是最快的。
你想要提取目的key可以直接这样:

l = [key for key in dict if key.startswith('h_bzmc')]

在python字典查找这块,时间复杂度是O(1),这是字典的优势。这上面无法进一步优化,
那么可以优化的地方就是递归了,不过水平有限,看看其他人答案吧。

本身查找和遍历(无序)的复杂度就是O(1)*O(N)了,所以如果你的key特别多或者处理key的逻辑比较复杂,可以考虑:

import multiprocessing
import time
some_data = {'h_bzmc1' :1,
             'h_bzmc2': 2,
             'h_bzmc3': 3,
             'h_bzmc4': 4,
             'h_bzmc5': 5,
             'b_bzmc1': 1,
             'b_bzmc2': 2,
             'b_bzmc3': 3,
             'b_bzmc4': 4,
             'b_bzmc5': 5,
             }
results=[]

def func(key):
    if key.startswith('h_bzmc'):
        time.sleep(1)
        return some_data[key]
    else:
        return -1


if __name__ == "__main__":
    t0 = time.time()
    pool = multiprocessing.Pool(processes = 10)
    for key in some_data:
        results.append(pool.apply_async(func, (key, )))

    pool.close()
    pool.join()
    print([_.get() for _ in results])
    print(time.time() - t0)


    t1 = time.time()
    print([func(key) for key in some_data if key.startswith('h_bzmc')] )
    print(time.time() - t1)

图片描述

iter方法返回的是一个迭代器,所以应该很快且占用内存很小,这个方法应该能满足需求,如果只要判断key的话完全可以如下这样:
l = [key for key in iter(dict) if key.startswith('h_bzmc')]

做成多级嵌套字典

dic={
    'b':{
        'tax':{},
        'update':{},
    },
    'h':{
        'bzmc':{},
        'comments':{},
    },
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题