我将2 MB数据作为字符串转换为dict。 输入以JSON序列化。
无论如何我目前正在使用ast.literal_eval并且我得到了我想要的字典,但是当我尝试运行eval时它似乎运行得更快,并且还返回相同的结果。
当eval工作正常时,有没有理由使用ast模块或json模块?
答案 0 :(得分:24)
我真的不喜欢stackoverflow(以及其他地方)的这种态度,告诉人们没有任何背景,他们正在做的事情是不安全的,他们不应该这样做。也许它只是导入一些数据的一次性脚本,在这种情况下为什么不选择最快或最方便的方式呢?
但是,在这种情况下,json.loads
不仅更安全,而且速度提高4倍以上(取决于您的数据)。
In [1]: %timeit json.loads(data)
10000 loops, best of 3: 41.6 µs per loop
In [2]: %timeit eval(data)
10000 loops, best of 3: 194 µs per loop
In [3]: %timeit ast.literal_eval(data)
1000 loops, best of 3: 269 µs per loop
如果您认为json是一种比python更受约束的语言/格式,那么使用优化的解析器解析它必须更快。
答案 1 :(得分:22)
是的,肯定有一个原因:eval()
是邪恶的。您的代码有一天可能会读取不受信任的数据,这样攻击者就可以在您的计算机上运行任意代码。
您也不应使用ast.literal_eval()
来解码JSON。它无法解码每个有效的JSON字符串,也不能用于此目的。只需使用json.loads()
,速度相当快。
答案 2 :(得分:16)
没有。除非您遇到以下两种情况之一:
那不是JSON!
有人将__import__('os').system('rm -rf /')
放入文件中。你很健全。
这是JSON,但不是类似Python的部分!
有人在其中放置true
,false
,null
或Unicode转义。生日快乐。
答案 3 :(得分:1)
不完全是答案,但应该注意eval
和literal_eval
不是一回事。 ast.literal_eval
不会运行任意代码。
那就是说,我同意使用JSON;我只想指出eval != literal_eval