我有一些文本(str
、bytes
;实际上是存储在磁盘文件中的gzip格式),可以通过 ast.literal_eval
进行解析。
它由一个字典列表组成,其中字典键为字符串,值为字符串、整数或浮点数。但是也许这个问题可以泛化到任何能够通过 ast.literal_eval
解析的字符串。
它很大:未压缩约为22MB。
最快的解析方法是什么?
当然可以使用 ast.literal_eval
,但这似乎非常慢。标准的 eval
稍微快一些(有趣的是,但可能是预期的,这取决于您对Python的了解程度;请参见 ast.literal_eval
的实现),但仍然很慢。
相比之下,当我将同样的数据序列化为JSON,然后加载JSON(json.loads
),这会快得多(>10倍)。因此,这表明原则上应该可以像解析JSON一样快速地解析它。
一些统计数据:
Gunzip + read time: 0.15111494064331055
Size: 22035943
compile: 3.1023156170000004
parse: 3.3381092380000004
eval: 3.0252232049999996
ast.literal_eval: 3.765798232
json.loads: 0.2657175249999994
此基准脚本以及生成这种虚假文本文件的脚本可以在此处找到:这里。(也许答案是:"需要更快的C实现;尚未有人实现")。
发帖后,我发现了一些相关问题。不过,我没有通过Google找到它们(也许我的搜索词“更快的literal_eval”不好)。 这部分回答了这个问题的一部分。
ast.literal_eval
,后者操作的是不需要的 JSON 超集。如果你的数据是 JSON 的子集,比如只有整数值,也许你可以利用它。 - ggorlen