通过json python循环非常慢

时间:2019-03-18 22:54:43

标签: python json

有人可以在以下代码中帮助我了解我的错吗:

        def matchTrigTohost(gtriggerids,gettriggers):
            mylist = []
            for eachid in gettriggers:
                gtriggerids['params']['triggerids'] = str(eachid)
                hgetjsonObject = updateitem(gtriggerids,processor)
                hgetjsonObject = json.dumps(hgetjsonObject)
                hgetjsonObject = json.loads(hgetjsonObject)
                hgetjsonObject = eval(hgetjsonObject)
                hostid = hgetjsonObject["result"][0]["hostid"]
                hname = hgetjsonObject["result"][0]["name"]
                endval = hostid + "--" + hname
                mylist.append(endval)
            return(hgetjsonObject)

变量gettriggers包含许多ID(〜3500):


[ "26821", "26822", "26810", ..... ]

我正在遍历变量中的id,并将它们分配给json对象。


gtriggerids = {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
                "output": ["hostid", "name"],
                "triggerids": "26821"
        },
        "auth": mytoken,
        "id": 2
}

当我对上面的json变量运行代码时,它非常慢。检查每个ID需要几分钟。我确定我在这里做错了很多事情,或者至少不是以pythonic的方式做的。谁能帮我加快速度?我是python的新手。

注意:

使用dump()load()eval()将产生的str转换为json。

1 个答案:

答案 0 :(得分:3)

您在了解自己做错事情时寻求帮助。乐意履行义务:-)

  1. 在最低级别上(为什么函数运行缓慢),您正在运行许多不必要的操作。具体来说,您要在格式(python字典和JSON字符串)之间移动数据,然后再次返回,这只会浪费CPU周期。

您提到这是获取所需格式的数据的唯一方法。那把我带到了你做错的第二件事。

  1. 您是在扔代码,而不是了解正在发生的事情。

我非常确定(并且您的一些评论者似乎同意)您的代码不是将数据整理成可用结构的唯一方法。相反,您应该做的是:

  • 尽可能多地了解所获得的数据。我怀疑updateitem()的输出应该是您学习的第一个目标。
  • 了解与该数据进行交互的正确/典型方式。您的数据没有必须先成为字典,然后才能使用。也许这不是最好的方法。
  • 了解数据可能具有哪些规律性和不规则性。部分问题可能与类型或字典无关,而与不可预测/肮脏的数据源有关。
  • 有了所有这些新知识,就可以尽可能轻松地操作您。

我可以保证结果运行得更快。


更多细节!您写的一些东西表明存在误解:

  

我正在遍历变量中的id,并将其分配给json对象。

否,您无法分配给JSON对象。在python中,JSON数据始终是字符串。您可能意味着您要分配给python字典,该字典(有时!)可以转换为以字符串表示的JSON对象。在继续前进之前,请确保您已清楚所有这些概念。

  

使用dump(),load()和eval()将产生的str转换为json。

同样,您不会在字符串上调用dumps()。您可以使用它将python对象转换为字符串。在REPL中运行此代码,逐步进行操作,并检查或尝试每个输出以了解其含义。