栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么json.loads比ast.literal_eval快一个数量级?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么json.loads比ast.literal_eval快一个数量级?

这两个函数正在解析完全不同的语言-
JSON和Python文字语法。*如前所述

literal_eval

提供的字符串或节点只能由以下Python文字结构组成:字符串,字节,数字,元组,列表,字典,集合,布尔值和

None

相比之下,JSON仅处理双引号的Javascript字符串文字(与Python的不太完全相同),Javascript数字(仅int和float*),对象(大致相当于dict),数组(大致等于列表),Javascript布尔值(与Python不同)和

null

这两种语言碰巧有重叠的事实并不意味着它们是同一语言。


为什么要

json.loads
这么快?

由于Python文字语法是一种比JSON更复杂,功能更强大的语言,因此解析起来可能会更慢。而且,可能更重要的是,由于Python文字语法不打算用作数据交换格式(实际上,它
应该专门用于该格式),因此没有人会为加快数据交换速度而付出很多努力。****

这个问题似乎暗示ast在输入数据(双引号或单引号)方面更灵活

那,原始字符串文字,以及Unipre vs. bytes字符串文字,以及复数,集合和JSON无法处理的所有其他内容。

在某些情况下,尽管速度较慢,但​​我更愿意在json.loads上使用ast.literal_eval?

是。当您想解析Python文字时,应使用

ast.literal_eval
。(或者,更好的是,重新考虑您的设计,以便您不想解析Python文字…)


*这是一个模糊的术语。例如,

-2
不是Python中的文字,而是运算符表达式,但
literal_eval
可以处理它。当然,元组/列表/字典/集合显示不是文字,但是
literal_eval
可以处理它们,除了理解也是显示,并且
literal_eval
不能处理它们。
ast
模块中的其他功能可以帮助您找出真正的字面值和非字面值,例如
ast.dump(ast.parse("expr"))

**例如,

"q"
是JSON中的错误。

***从技术上讲,JSON仅处理一种“数字”类型,即浮点数。但是Python的

json
模块将不带小数点或指数的数字解析为整数,在许多其他语言的JSON模块中也是如此。

****如果您错过了蒂姆·彼得斯(Tim Peters)对以下问题的评论:“

ast.literal_eval
使用率太低,没有人觉得值得花时间(和工作,和工作)来加速它。相反,JSON库通常用于解析千兆字节的数据。”



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/616675.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号