【问题标题】:Python How to get first key from jsonPython如何从json中获取第一个密钥
【发布时间】:2018-04-17 15:26:36
【问题描述】:

我将 Json 用于 NLP/ML,这意味着我的 json 文件是 HUUUGE。

使用 MyPy(不要混淆这是 python。)

import json
from pprint import pprint
from typing import List

from Models.NewsDataModel import NewsDataModel, CreateNewNewsModelFromJson

jsonDataPath = "../DataSource/evileye-quorraengine-News-export.json"
rootJson = json.load(open(jsonDataPath))


def GetNewsData(max:int=0, hasMaxValue:bool=False)->List[NewsDataModel]:
    newsDataList = []

    jsonKeys = rootJson.keys()

    for newsDataKey in jsonKeys:

        newNewsData = CreateNewNewsModelFromJson(rootJson[newsDataKey])
        newsDataList.append(newNewsData)
        if hasMaxValue and len(newsDataList) >= max:
            break

    return newsDataList

但是。因为我有 120000 个密钥,所以只获取密钥需要 5 秒以上。 我如何限制要检索的键?

【问题讨论】:

    标签: python json


    【解决方案1】:

    好吧,使用python普通字典你不能,如question中所述:

    没有“前 n 个”键这样的东西,因为 dict 不记得先插入了哪些键。

    但是,同一个问题显示了一种使用itertools recipes 解决此问题的方法,特别是islice(iterable, start, stop[, step]) 方法,正如docs 中所述:

    如果 start 不为零,则跳过可迭代的元素,直到到达 start。之后,元素将连续返回,除非 step 设置为高于 1 导致项目被跳过。如果 stop 为 None,则迭代继续,直到迭代器耗尽(如果有的话); 否则会停在指定位置

    不幸的是,我没有足够大的字典来尝试它,但是,如果运行时间仍然比您想要的多,您可以尝试使用 OrderedDict,如 here 所示,虽然我没有认为它会比itertools.islice表现更好

    【讨论】:

    • 很抱歉,您的第一个链接已关闭
    • 使用字典意味着我首先必须将 json 转换为字典。我认为这需要更多的时间..(?)
    • 考虑到 e.s 的答案,转换为字典需要的时间可以忽略不计
    【解决方案2】:

    看来json.load 必须先处理整个字符串。输入字典形式需要的时间可以忽略不计。您可以使用object_pairs_hook kwarg 控制输出。这可以帮助您维持秩序,但不会加快任何速度。 (可能存在可以忽略不计的时间差异,但瓶颈是解析字符串)这是 120,000 个键字典的时间。

    In[141]: test = {x:x for x in range(120000)}
    In[142]: tst_str = json.dumps(test)
    In[143]: %timeit json.loads(tst_str, object_pairs_hook=lambda x: x)[:10]
    10 loops, best of 3: 55.7 ms per loop
    In[144]: %timeit tester=json.loads(tst_str, object_pairs_hook=lambda x: iter(x));[next(tester) for _ in range(10)]
    10 loops, best of 3: 54.4 ms per loop
    In[145]: %timeit json.loads(tst_str)
    10 loops, best of 3: 57.5 ms per loop
    In[146]: json.loads(tst_str, object_pairs_hook=lambda x: x)[:10]
    Out[146]: 
    [('0', 0),
     ('1', 1),
     ('2', 2),
     ('3', 3),
     ('4', 4),
     ('5', 5),
     ('6', 6),
     ('7', 7),
     ('8', 8),
     ('9', 9)]
    In[147]: tester=json.loads(tst_str, object_pairs_hook=lambda x: iter(x))
    In[148]: tester
    Out[148]: <list_iterator at 0x86caef0>
    In[149]: [next(tester) for _ in range(10)]
    Out[149]: 
    [('0', 0),
     ('1', 1),
     ('2', 2),
     ('3', 3),
     ('4', 4),
     ('5', 5),
     ('6', 6),
     ('7', 7),
     ('8', 8),
     ('9', 9)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      相关资源
      最近更新 更多