python處理json字符串(使用json.loads而不是eval())
eval 跟json.loads 是不一樣的函數(shù),是有實(shí)現(xiàn)不一樣功能的地方,但是在某些地方它們兩個(gè)函數(shù)的功能是一樣的,在這個(gè)時(shí)候如果對(duì)執(zhí)行效率有一定要求的話,建議不要用eval,改用json.loads會(huì)有驚喜哦。
一、eval
eval() 函數(shù)用來(lái)執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值。
二、json.loads
json.loads 用于解碼 JSON 數(shù)據(jù)。該函數(shù)返回 Python 字段的數(shù)據(jù)類型。
json.loads與eval都能將json字符串轉(zhuǎn)成python中的對(duì)象,但在實(shí)際工作中發(fā)現(xiàn),在處理json字符串時(shí),json.loads的性能遠(yuǎn)超eval
三、效率對(duì)比
下列代碼是通過(guò)json.loads和eval方式將103KB大小的json字符串轉(zhuǎn)python字典的耗時(shí)對(duì)比:
old_data = redis_con.get('api-case-version:' + str(version_id)) if old_data: l_start = datetime.datetime.now() load_dict = json.loads(old_data) l_end = datetime.datetime.now() print('json.loads', l_end - l_start) e_start = datetime.datetime.now() old_dict = eval(old_data) e_end = datetime.datetime.now() print('eval', e_end - e_start)
耗時(shí)對(duì)比
耗時(shí)相差了13倍多。
在平時(shí)的場(chǎng)景下很難遇到處理大JSON字符串的情況,所以使用loads或eval差別可以忽略不計(jì)。但在我目前的項(xiàng)目中,是需要取swagger上的所有接口做對(duì)比,JSON字符串的大小經(jīng)常達(dá)到1M+,這時(shí)使用loads和eval就有了較為明顯的性能差異了。
但是使用json.loads有個(gè)地方需要注意一下,json.loads對(duì)列表沒(méi)什么要求,但是對(duì)字典的格式有一定的要求,key值要保持是雙引號(hào)的key,單引號(hào)的key或者int類型都會(huì)報(bào)錯(cuò)。
報(bào)錯(cuò)內(nèi)容如下
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
因此字典的話建議儲(chǔ)存格式就是要用json.dumps轉(zhuǎn)換成標(biāo)準(zhǔn)的json格式然后再儲(chǔ)存成字符串。
另外如果是其他序列化格式的,對(duì)json的速度不滿意的可以考慮用一下msgpack,使用方式也很簡(jiǎn)單,但是也是對(duì)格式有一定的要求,有很多博主進(jìn)行過(guò)測(cè)試,都是比json快幾倍以上。這里就不詳講了。
到此這篇關(guān)于python處理json字符串(使用json.loads而不是eval())的文章就介紹到這了,更多相關(guān)python處理json字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Puppeteer爬取微信文章的實(shí)現(xiàn)
這篇文章主要介紹了使用Puppeteer爬取微信文章的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02淺析pytest?鉤子函數(shù)?之初始鉤子和引導(dǎo)鉤子
這篇文章主要介紹了pytest?鉤子函數(shù)?之初始鉤子和引導(dǎo)鉤子,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09Python使用fastAPI如何實(shí)現(xiàn)一個(gè)流式傳輸接口
這篇文章主要介紹了Python使用fastAPI如何實(shí)現(xiàn)一個(gè)流式傳輸接口問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06Python3如何實(shí)現(xiàn)Win10桌面自動(dòng)切換
這篇文章主要介紹了Python3如何實(shí)現(xiàn)Win10桌面自動(dòng)切換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08解決keras加入lambda層時(shí)shape的問(wèn)題
這篇文章主要介紹了解決keras加入lambda層時(shí)shape的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06對(duì)python xlrd讀取datetime類型數(shù)據(jù)的方法詳解
今天小編就為大家分享一篇對(duì)python xlrd讀取datetime類型數(shù)據(jù)的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12利用python生成一個(gè)導(dǎo)出數(shù)據(jù)庫(kù)的bat腳本文件的方法
下面小編就為大家?guī)?lái)一篇利用python生成一個(gè)導(dǎo)出數(shù)據(jù)庫(kù)的bat腳本文件的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12基于Python中numpy數(shù)組的合并實(shí)例講解
下面小編就為大家分享一篇基于Python中numpy數(shù)組的合并實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Python實(shí)現(xiàn)繁體轉(zhuǎn)為簡(jiǎn)體的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)繁體轉(zhuǎn)為簡(jiǎn)體的方法,涉及Python編碼轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2018-12-12