python eval vs ast.literal_eval vs JSON decode

MxL*_*evs 16 python

我将2 MB数据作为字符串转换为字典.输入以JSON序列化.

无论如何我目前正在使用ast.literal_eval并且我得到了我想要的字典,但是当我尝试运行eval时它似乎运行得更快,并且还返回相同的结果.

当eval工作得很好时,有没有理由使用ast模块或json模块?

Maa*_*ten 30

我真的不喜欢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
Run Code Online (Sandbox Code Playgroud)

如果您认为json是一种比python更受约束的语言/格式,那么使用优化的解析器解析它必须更快.

  • SO不仅仅是回答OP的问题:它还成为其他人阅读的参考。 (2认同)

Sve*_*ach 25

是的,这绝对是一个原因: eval()是邪恶的.您的代码有一天可能会读取不受信任的数据,这样攻击者就可以在您的计算机上运行任意代码.

您也不应该使用ast.literal_eval()解码JSON.它无法解码每个有效的JSON字符串,也不能用于此目的.简单地使用json.loads(),它的速度相当快.

  • @Keikoku:那么如果它不是你的机器,你不在乎? (2认同)

Ign*_*ams 16

不会.除非您遇到以下两种情况之一:

  1. 那不是JSON!

    有人放入__import__('os').system('rm -rf /')文件中.你是骨头.

  2. 它是JSON,但不是类似Python的部分!

    有人提出true,false,null,或者一个Unicode在它的地方逃跑.生日快乐.

  • @NasBanov:见http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html (3认同)