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字典的耗时对比:
1
2
3
4
5
6
7
8
9
10
|
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快几倍以上。这里就不详讲了。
到此这篇关于python处理json字符串(使用json.loads而不是eval())的文章就介绍到这了,更多相关python处理json字符串内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://quniao.blog.csdn.net/article/details/117706789