提高嵌套 for 循环的效率



所以我正在遍历一些JSON数据,这很慢,因为我正在使用嵌套的循环。

我的代码如下所示:

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 循环还是请求是瓶颈(

最新更新