python處理json字符串(使用json.loads而不是eval())
eval 跟json.loads 是不一樣的函數(shù),是有實現(xiàn)不一樣功能的地方,但是在某些地方它們兩個函數(shù)的功能是一樣的,在這個時候如果對執(zhí)行效率有一定要求的話,建議不要用eval,改用json.loads會有驚喜哦。
一、eval
eval() 函數(shù)用來執(zhí)行一個字符串表達(dá)式,并返回表達(dá)式的值。
二、json.loads
json.loads 用于解碼 JSON 數(shù)據(jù)。該函數(shù)返回 Python 字段的數(shù)據(jù)類型。
json.loads與eval都能將json字符串轉(zhuǎn)成python中的對象,但在實際工作中發(fā)現(xiàn),在處理json字符串時,json.loads的性能遠(yuǎn)超eval
三、效率對比
下列代碼是通過json.loads和eval方式將103KB大小的json字符串轉(zhuǎn)python字典的耗時對比:
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)
耗時對比

耗時相差了13倍多。
在平時的場景下很難遇到處理大JSON字符串的情況,所以使用loads或eval差別可以忽略不計。但在我目前的項目中,是需要取swagger上的所有接口做對比,JSON字符串的大小經(jīng)常達(dá)到1M+,這時使用loads和eval就有了較為明顯的性能差異了。
但是使用json.loads有個地方需要注意一下,json.loads對列表沒什么要求,但是對字典的格式有一定的要求,key值要保持是雙引號的key,單引號的key或者int類型都會報錯。
報錯內(nèi)容如下
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
因此字典的話建議儲存格式就是要用json.dumps轉(zhuǎn)換成標(biāo)準(zhǔn)的json格式然后再儲存成字符串。
另外如果是其他序列化格式的,對json的速度不滿意的可以考慮用一下msgpack,使用方式也很簡單,但是也是對格式有一定的要求,有很多博主進(jìn)行過測試,都是比json快幾倍以上。這里就不詳講了。
到此這篇關(guān)于python處理json字符串(使用json.loads而不是eval())的文章就介紹到這了,更多相關(guān)python處理json字符串內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信