在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Python/ Python 提高查找dict的key的效率?

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

clipboard.png

現(xiàn)在我需要將其中h_bzmc開(kāi)頭的所有信息提取出來(lái),我用的是這個(gè)辦法:

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很多的情況下速度是否會(huì)受到較大影響?是否有效率更高的方法呢?

回答
編輯回答
凹凸曼

圖片描述

iter方法返回的是一個(gè)迭代器,所以應(yīng)該很快且占用內(nèi)存很小,這個(gè)方法應(yīng)該能滿(mǎn)足需求,如果只要判斷key的話(huà)完全可以如下這樣:
l = [key for key in iter(dict) if key.startswith('h_bzmc')]

2017年10月27日 01:54
編輯回答
葬憶

做成多級(jí)嵌套字典

dic={
    'b':{
        'tax':{},
        'update':{},
    },
    'h':{
        'bzmc':{},
        'comments':{},
    },
}
2017年6月6日 19:00
編輯回答
舊城人

在python字典查找這塊,時(shí)間復(fù)雜度是O(1),這是字典的優(yōu)勢(shì)。這上面無(wú)法進(jìn)一步優(yōu)化,
那么可以?xún)?yōu)化的地方就是遞歸了,不過(guò)水平有限,看看其他人答案吧。

2017年5月21日 04:10
編輯回答
失心人

按照python官方的說(shuō)法是直接for key in dict這種方式查找key是最快的。
你想要提取目的key可以直接這樣:

l = [key for key in dict if key.startswith('h_bzmc')]
2018年8月16日 13:02
編輯回答
愛(ài)礙唉

本身查找和遍歷(無(wú)序)的復(fù)雜度就是O(1)*O(N)了,所以如果你的key特別多或者處理key的邏輯比較復(fù)雜,可以考慮:

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)
2017年6月19日 08:38