【问题标题】:eval vs json.loads memory consumptioneval vs json.loads 内存消耗
【发布时间】:2017-06-16 06:45:56
【问题描述】:

我有一本字典,我正在写入一个文件,然后再次加载它。字典有一些集合,所以我可以选择使用自定义 ModelEncoder 执行 eval()json.dumps()

我都试过了,json 的内存占用比eval 小得多。为什么eval 占用这么多内存?

【问题讨论】:

  • eval 是一个更通用的操作。为什么它没有像严格约束的那样得到优化,这令人惊讶? (此外,考虑到这些限制在多大程度上排除了几类安全漏洞,您为什么还要考虑 eval?)
  • @CharlesDuffy 我正在保存和读取我的数据,所以这是一种快速的方法。
  • 相信您的数据通常是错误的。一个设计良好的部署模型通常会有代码是只读的,但不能避免数据是读写的;通过将数据评估为代码,您就挫败了运维团队阻止可以存储任意数据的攻击者执行任意代码的努力。
  • 绝对不是 eval 应该用于的。考虑使用picklemsgpack 或类似的库。
  • 另外,eval 在这种情况下使用时有问题。见Is JSON syntax a strict subset of Python syntax?

标签: python


【解决方案1】:

您是否应该使用eval 确实是另一个问题。

eval 占用更多内存的主要原因是文本首先被编译成 Python 表达式(解析、转换为字节码)然后进行评估。

特别是对于大字面量,python 有一个memory leak in the bytecode compiler。本期讨论 pyc 编译,但你也会在 eval 中进行代码编译。

json 不会因此受到影响,因为它不会将您的文本转换为可执行字节码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 2016-05-03
    • 2010-10-12
    • 1970-01-01
    • 2011-10-03
    • 2012-11-24
    • 2013-10-08
    • 1970-01-01
    相关资源
    最近更新 更多