【问题标题】:Is it possible to use ijson to create and load JSON objects in memory (not from/to a file)?是否可以使用 ijson 在内存中创建和加载 JSON 对象(而不是从/到文件)?
【发布时间】:2017-12-08 16:42:39
【问题描述】:

我正在尝试使用 ijson 而不是 json 来高效地将字典转储/加载到字符串(在内存中,而不是从文件中)[1]。

是否有任何ijson 的示例类似于使用json 进行标准转储/加载?我见过的所有使用ijson 的来源都只有文件示例。

[1] -- 将字典转换为字符串以便将它们存储在集合中

【问题讨论】:

    标签: python ijson


    【解决方案1】:

    您可以同时达到两个目标(字典到字符串和字符串到字典,而无需使用 json 库)。

    我们看上面的例子:

    import ast
    di = {"a":2, "b": 3}
    
    print (str(di))
    >>> "{'a': 2, 'b': 3}"
    
    print (type(str(di)))
    >>> <class 'str'>
    
    print (ast.literal_eval(str(di)))
    >>> {'a': 2, 'b': 3}
    
    print (type(ast.literal_eval(str(di))))
    >>> <class 'dict'>
    

    你有一个字典,为了把它变成字符串,你只需要把它转换成str

    如果你想将 str 返回到 dict 你可以使用ast lib。

    你可以阅读更多关于ast.literal_eval的信息

    ast.literal_eval(node_or_string)

    安全地评估表达式节点或包含 Python 文字或容器显示的 Unicode 或 Latin-1 编码字符串。

    编辑:

    经过进一步调查并关注this SO question 似乎使用 json 可以让您获得更快的结果(性能)。

    查看附加链接上的 abarnert 答案,特别是:

    为什么 json.loads 这么快?

    因为 Python 文字语法是 比 JSON 更复杂、更强大的语言,它可能会更慢 解析。而且,可能更重要的是,因为 Python 字面量 语法不打算用作数据交换格式(在 事实上,它特别不应该用于那个),没有人是 可能会付出很多努力来加快数据交换速度。

    import json
    di = {"a":2, "b": 3}
    
    print (json.dumps(di))
    >>> '{"a": 2, "b": 3}'
    
    print (type(json.dumps(di)))
    >>> <class 'str'>
    
    print (json.loads(json.dumps(di)))
    >>> {'a': 2, 'b': 3}
    
    print (type(json.loads(json.dumps(di))))
    >>> <class 'dict'>
    

    【讨论】:

    • 我之前考虑过 eval,但我注意到它与性能不佳有关。我认为 ijson 会是一个好方法的原因是它的效率。但是,它相对于标准 json 是有效的,所以我不知道它与 eval 相比如何。
    • 我可以更清楚。效率,我的意思是速度。如果您对 dict/str 转换的最高效方法有任何想法,请告诉我。
    • @Phillip ,阅读此answer - Why is json.loads an order of magnitude faster than ast.literal_eval? 以了解为什么使用 json 比 literal_eval 快得多
    • @Phillip ,我已经在我的答案中添加了一个 EDIT 部分,但一切都在内存中。祝你好运!
    【解决方案2】:

    为了在性能方面补充 omri_saadon 的回答,

    这是一个链接 (serializer speed comparisons),用于衡量一些鲜为人知的 JSON 模块,其中一个被发现有效地优于其他 (msgpack),并且可以与 json 互换使用。

    因此,msgpack 目前用于 dict/str 转换,而不是 ijson 或标准 json

    要安装: pip install msgpack

    使用: import msgpack as json# can use dumps/loads functions

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多