python处理json字符串(使用json.loads而不是eval())
作者:曲鸟 时间:2023-06-13 11:50:39
eval 跟json.loads 是不一样的函数,是有实现不一样功能的地方,但是在某些地方它们两个函数的功能是一样的,在这个时候如果对执行效率有一定要求的话,建议不要用eval,改用json.loads会有惊喜哦。
一、eval
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
二、json.loads
json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。
json.loads与eval都能将json字符串转成python中的对象,但在实际工作中发现,在处理json字符串时,json.loads的性能远超eval
三、效率对比
下列代码是通过json.loads和eval方式将103KB大小的json字符串转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字符串的大小经常达到1M+,这时使用loads和eval就有了较为明显的性能差异了。
但是使用json.loads有个地方需要注意一下,json.loads对列表没什么要求,但是对字典的格式有一定的要求,key值要保持是双引号的key,单引号的key或者int类型都会报错。
报错内容如下
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
因此字典的话建议储存格式就是要用json.dumps转换成标准的json格式然后再储存成字符串。
另外如果是其他序列化格式的,对json的速度不满意的可以考虑用一下msgpack,使用方式也很简单,但是也是对格式有一定的要求,有很多博主进行过测试,都是比json快几倍以上。这里就不详讲了。
来源:https://quniao.blog.csdn.net/article/details/117706789