python - 解析字典的最快 pythonic 方式,其中值是字节字符串化的 json 对象

标签 python json python-3.x dictionary ujson

所以我有一个字典,它是我从 Redis 获取的哈希对象,类似于以下字典:

source_data = {
   b'key-1': b'{"age":33,"gender":"Male"}', 
   b'key-2': b'{"age":20,"gender":"Female"}'
}

我的目标是从这个字典中提取所有值,并将它们作为 Python 字典列表,如下所示:

final_data = [
   {
      'age': 33,
      'gender': 'Male'
   },

   {
      'age': 20,
      'gender': 'Female'
   }
]

我尝试使用 json 解析进行列表理解:

import json
final_data = [json.loads(a) for a in source_data.values()]

它有效,但对于大型数据集,它需要太多时间。

我切换到使用这个第 3 方 json 模块 ujson根据这个benchmark哪个更快,但我没有注意到任何改进。

我试过使用多线程:

pool = Pool()
final_data = pool.map(ujson.loads, source_data.values(), chunksize=500)

pool.close()
pool.join()

我玩了一下 chunksize 但结果是一样的,仍然花费太多时间。

如果有人可以提出另一种解决方案或改进以前的尝试,那将非常有帮助,如果我可以避免使用循环,那将是理想的选择。

最佳答案

假设这些值确实是有效的 JSON,构建单个 JSON 对象进行解码可能会更快。我认为将这些值连接成一个字符串应该是安全的。

>>> new_json = b'[%s]' % (b','.join(source_data.values(),)
>>> new_json
b'[{"age":33,"gender":"Male"},{"age":20,"gender":"Female"}]'
>>> json.loads(new_json)
[{'age': 33, 'gender': 'Male'}, {'age': 20, 'gender': 'Female'}]

这取代了调用 json.loads 2000 次以上的开销,而调用 b','.join 和一个字符串格式化的开销较小操作。

关于python - 解析字典的最快 pythonic 方式,其中值是字节字符串化的 json 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51156095/

相关文章:

python - 将数组和元组元素转换为 Pandas 数据框中的列

javascript - 如何使用 php mysql json 根据 url 中的行 id 从数据库检索值?

php - 在函数php中获取json数据

python - 使用 JSON 处理 GET 和 POST 请求的简单 Python 服务器

python - 如何使用数据透视表 Python 创建重复行

Python scipy chisquare 返回与 R chisquare 不同的值

python - Bokeh :使用复选框小部件隐藏和显示图

python-3.x - 如何让 Pycrypto 在 Docker 上正常工作?

python - 目标为列表时的 Pygame 设置音量

python - 查询在测试中返回空 - Django