Python 提高嵌套for循环的效率

Python 提高嵌套for循环的效率,python,json,for-loop,nested,python-requests,Python,Json,For Loop,Nested,Python Requests,所以我迭代了一些JSON数据,速度非常慢,因为我使用嵌套for循环 我的代码如下所示: import requests import json pokemon_url = 'https://pokeapi.co/api/v2/pokemon/bulbasaur/' pokemon_move_url = 'https://pokeapi.co/api/v2/move/pound/' pokemon_info = requests.get(pokemon_url) pokemon_data =

所以我迭代了一些JSON数据,速度非常慢,因为我使用嵌套for循环

我的代码如下所示:

import requests
import json


pokemon_url = 'https://pokeapi.co/api/v2/pokemon/bulbasaur/'
pokemon_move_url = 'https://pokeapi.co/api/v2/move/pound/'
pokemon_info = requests.get(pokemon_url)
pokemon_data = pokemon_info.text
pokemon_parsed = json.loads(pokemon_data)


name = pokemon_parsed['forms'][0]['name']

for move in pokemon_parsed['moves']:
    for method in move['version_group_details']:
        if method['version_group']['name'] == 'sun-moon' and method['move_learn_method']['name'] == 'level-up':
            pokemon_move_url = 'https://pokeapi.co/api/v2/move/'+move['move']['name']
            pokemon_move = requests.get(pokemon_move_url)
            pokemon_move_text = pokemon_move.text
            pokemon_parsed_moves = json.loads(pokemon_move_text)
            print(method['move_learn_method']['name'],move['move']['name'],method['level_learned_at'],pokemon_parsed_moves['type']['name'],pokemon_parsed_moves['power'],pokemon_parsed_moves['accuracy'])

我想知道如何才能更有效、更好地完成这项工作。我知道有更好的方法,但我刚开始学习Python,所以我还在学习

正如Sergio提到的,http请求可能比for循环慢,但是当您有大量迭代时,for循环也会减慢速度。您可以尝试使用列表理解构建URL列表,然后执行以下请求: 对于内部循环中的第一行,它将是:

pokemon_move_url = ['https://pokeapi.co/api/v2/move/'+move['move']['name'] for move in pokemon_parsed['moves'] for method in move['version_group_details'] if method['version_group']['name'] == 'sun-moon' and method['move_learn_method']['name'] == 'level-up']
pokemon_move = [requests.get(url) for url in pokemon_move_url]
pokemon_move_text = [move.text for move in pokemon_move]
pokemon_parsed_moves = [json.loads(text) for text in pokemon_move_text]

这应该比使用for循环快得多(当然,这取决于for循环或请求是瓶颈)

“这非常慢,因为我使用嵌套for循环”-不,这很慢,因为每次迭代都会执行http请求。这是缓慢的部分,而不是循环。它看起来像是
pokemon\u move=requests.get(pokemon\u move\u url)
可以安全地从内部循环(到外部循环)中提取出来。塞尔吉奥图兰采夫非常感谢你,现在我明白我做错了什么,我可以从中吸取教训。这解决了我的问题!谢谢你的回复。我试过你的代码,但我唯一没用的是打印方面。我应该如何处理您的代码?尝试:输出=[method['move\u learn\u method']['name']、move['move']['name']、method['level\u learn\u at']、parsed\u move['type']['name']、parsed\u move['power']、parsed\u move['accuracy'])用于口袋妖怪中的解析移动[u解析移动]打印(输出)这将打印所有所需打印的列表。要将所有条目分开,您可以尝试:[打印(条目)以用于输出中的条目]我不是列表理解的专家,但我认为它应该会起作用。@JtenBulte:这种列表理解,我非常怀疑它会比for循环快多少(同样的循环有一张漂亮的脸),但现在它也需要更多的内存(需要一次构建和存储所有URL)。啊,谢谢你的评论。我对Python还是比较陌生,尤其是列表理解。有人告诉我,这会更快,因为它是用C编译的,但你的链接说不是。