詳解Python字典查找性能
timeit.repeat
timeit.repeat默認(rèn)會(huì)執(zhí)行3輪,每輪執(zhí)行1000000次。返回每輪的總執(zhí)行時(shí)間列表
字典獲取性能
大家都知道字典獲取分為
中括號(hào)獲取,獲取不到會(huì)拋出KeyError
get獲取,獲取不到會(huì)返回默認(rèn)值
下面比較兩種獲取方式的性能
數(shù)據(jù)準(zhǔn)備
一條簡(jiǎn)單一條復(fù)雜
# logging標(biāo)準(zhǔn)庫(kù)的level字典
level_mapping = {'CRITICAL': 50, 'FATAL': 50, 'ERROR': 40, 'WARN': 30, 'WARNING': 30, 'INFO': 20, 'DEBUG': 10, 'NOTSET': 0}
# elasticsearch日志
record = {'_index': 'logstash-project.test-env.release-user.root-2021', '_type': 'doc', '_id': '2f60jn0BaH-cdSPUSkiF', '_version': 1, '_score': None, '_source': {'method': 'GET', 'index_name': 'project.test-env.release-user.root', '@version': 'flask', 'path': 'D:\\alpha\\flask\\logstash\\core\\flask.py', 'logger_name': 'flask.exception', 'stack_info': None, 'user': 'root', '@timestamp': '2021-12-06T07:45:20.056Z', 'level': 'ERROR', 'thread_name': 'Thread-5', 'type': 'exception', 'env': 'release', 'process': 8716, 'funcName': 'exceptions', 'port': 55792, 'project': 'test', 'tags': [], 'lineno': 89, 'request': {'headers': {'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Postman-Token': '359faa6e-9527-4de7-82ff-eecb92656875', 'User-Agent': 'PostmanRuntime/7.28.4', 'Cookie': 'csrftoken=bf58fmaG5wBVabJwBeD8srVsfw7EjKe0VN7xD8mu817UzVm', 'Accept': '*/*', 'Host': '127.0.0.1:5000'}, 'args': {'a': '11', 'b': '22'}}, 'message': 'division by zero', 'host': 'DESKTOP-JCQ9527', 'status_code': 500, 'stack_trace': 'Traceback (most recent call last):\n File "D:\\Envs\\logstash\\lib\\site-packages\\flask\\app.py", line 1950, in full_dispatch_request\n rv = self.dispatch_request()\n File "D:\\Envs\\logstash\\lib\\site-packages\\flask\\app.py", line 1936, in dispatch_request\n return self.view_functions[rule.endpoint](**req.view_args)\n File "D:\\flask\\logstash\\app.py", line 112, in get_raise\n a/0\nZeroDivisionError: division by zero\n', 'remote_addr': '127.0.0.1', 'url': 'http://127.0.0.1:5000/raise?a=11&b=22'}, 'fields': {'@timestamp': ['2021-12-06T07:45:20.056Z']}, 'sort': [1638776720056]}
def test():
level_mapping['CRITICAL']
timeit.repeat(lambda: test())
[0.08700739999994767, 0.0864886999997907, 0.08675769999990735]
# 中括號(hào)加try except
def test1():
try:
level_mapping['CRITICA']
except:
pass
timeit.repeat(lambda: test1())
[0.09164779999991879, 0.0921809999999823, 0.09076550000099814] # key存在
[0.17694680000022345, 0.1759290999998484, 0.17659119999916584] # key不存在
def test2():
level_mapping.get('CRITICAL')
timeit.repeat(lambda: test2())
[0.131671400000414, 0.12985489999982747, 0.13035420000005615]
中括號(hào)獲取比get方式快了50%左右;
但當(dāng)使用中括號(hào)加try except,key不存在時(shí)要慢近一倍;
使用get時(shí)key存不存在設(shè)不設(shè)默認(rèn)值都一樣。
復(fù)雜獲取
def test3():
level_mapping[record['_source']['level']]
timeit.repeat(lambda: test3())
[0.1141027999999551, 0.11351319999994303, 0.11431539999989582]
def test4():
level_mapping.get(record.get('_source').get('level'))
timeit.repeat(lambda: test4())
[0.22142400000007, 0.21937850000017534, 0.21913369999992938]
隨著數(shù)據(jù)的復(fù)雜嵌套和鏈?zhǔn)讲僮鳎@次快了整整一倍。
總結(jié)
在能非常確定key存在且頻繁獲取數(shù)據(jù)的情況下,應(yīng)該盡量使用中括號(hào)取值。
另外在Python3.6后,重寫(xiě)了字典的底層數(shù)據(jù)結(jié)構(gòu),從而使字典變得有序。
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python?eval()和exec()函數(shù)使用詳解
exec函數(shù)執(zhí)行的是python語(yǔ)句,沒(méi)有返回值,eval函數(shù)執(zhí)行的是python表達(dá)式,有返回值,exec函數(shù)和eval函數(shù)都可以傳入命名空間作為參數(shù),本文給大家介紹下Python?eval()和exec()函數(shù),感興趣的朋友跟隨小編一起看看吧2022-11-11
opencv 攝像機(jī)標(biāo)定的實(shí)現(xiàn)
本文主要介紹了opencv 攝像機(jī)標(biāo)定的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
python實(shí)現(xiàn)的解析crontab配置文件代碼
這篇文章主要介紹了python實(shí)現(xiàn)的解析crontab配置文件代碼,也可以說(shuō)是python版的crontab,代碼中包含大量注釋,需要的朋友可以參考下2014-06-06
Python MySQLdb模塊連接操作mysql數(shù)據(jù)庫(kù)實(shí)例
這篇文章主要介紹了Python MySQLdb模塊連接操作mysql數(shù)據(jù)庫(kù)實(shí)例,本文直接給出操作mysql代碼實(shí)例,包含創(chuàng)建表、插入數(shù)據(jù)、插入多條數(shù)據(jù)、查詢數(shù)據(jù)等內(nèi)容,需要的朋友可以參考下2015-04-04
Python可視化學(xué)習(xí)之seaborn繪制矩陣圖詳解
矩陣圖即用一張圖繪制多個(gè)變量之間的關(guān)系,數(shù)據(jù)挖掘中常用于初期數(shù)據(jù)探索。本文介紹python中seaborn.pairplot和seaborn.PairGrid繪制矩陣圖,需要的可以參考一下2022-02-02
Python中用于檢查英文字母大寫(xiě)的isupper()方法
這篇文章主要介紹了Python中用于檢查英文字母大寫(xiě)的isupper()方法,是Python入門(mén)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05
Python編程之基于概率論的分類(lèi)方法:樸素貝葉斯
這篇文章主要介紹了Python編程之基于概率論的分類(lèi)方法:樸素貝葉斯,簡(jiǎn)單介紹了其概述,貝葉斯理論和條件概率,以及樸素貝葉斯的原理等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
安裝Pycharm2019以及配置anconda教程的方法步驟
這篇文章主要介紹了安裝Pycharm2019以及配置anconda教程的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
淺析Python中的getattr(),setattr(),delattr(),hasattr()
這篇文章主要介紹了Python中的getattr(),setattr(),delattr(),hasattr() 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06

