Повысить эффективность вложенных циклов - PullRequest
0 голосов
/ 05 июля 2018

Итак, я перебираю некоторые данные 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, поэтому я все еще учусь.

1 Ответ

0 голосов
/ 05 июля 2018

Как отмечает Серхио, 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 или запрос узким местом)

...