解決したいこと
初めてちゃんとしたコードを書いたのですが、実行に5分もかかることがあり、書き方次第でもっと早くできるところがあるんじゃないかと思い質問させていただきました。よろしくお願いします。
###特に遅い部分
python
1def selfdeck_list(name,newnum): 2 #decktype = battle_info(name)[0]["type"] 3 #cardsname = battle_info(name)[0]["team"][0]["cards"][1]["name"] 4 5 内包表記バージョン? 6 decklist = [ battle_info(name)[decknum]["team"][0]["cards"][numindeck]["name"] for decknum in range(0,25) for numindeck in range(0,8) ] 7 decktype = [ battle_info(name)[decknum]["type"] for decknum in range(0,25)]""" 8 9 return decktype[int(newnum)] 10 return decklist[int(newnum*8):int(newnum*8+8)] 11 12selfdeck_list("Scott",0)
##プログラムの概要
クラッシュロワイヤルというゲームのAPIを受け取り、選手の情報や対戦デッキをpandasのデータフレームに収集するというプログラムです。コードの横にコメント形式でもう少し詳細に書いています。
実際のコード全体
python3.72
1#クラロワAPIからプロ選手の情報を取得するプログラム 2import time 3import json 4import requests 5import pandas as pd 6import numpy as np 7 8access_key = "ここでは省略" 9 10URL = 'https://api.clashroyale.com/v1' 11 12#選手名とパスを結合する辞書を作成 13dic={"みかん坊や":"%232VYJYJ09","天GOD":"%232G0QUGLU","kota":"%23889VQ8JP","RAD":"%238QRCJQ9Y","ライキジョーンズ":"%2398Q8LPQ9", 14 "Jack":"%23YRVL9U98","きたっしゃん":"%23P8RLYOV9","だに":"%238LJVVGJP","けんつめし":"%23PQRR0CG9", 15 "Rorapolon":"%239JPRJ9R","焼き鳥":"%232Y8GL0V2","ユイヒイロ":"%23R2GRQPCJ","Blossom":"%238Q20LRC8Y","kk19212":"%23RU2CC2LG", 16 "れいや":"%232LRVG0C8","HANE×HANE":"%238Y088VU8U","Lewis":"%238Q020U0U","ピラメキ":"%232YGQGY92V","天ぷら":"%238Q2V2CGR","Scott":"%232Q98GVP9V"} 17 18# 選手名を含むリストを作成 19list= ["みかん坊や","天GOD","kota","RAD","ライキジョーンズ", 20 "Jack","きたっしゃん","だに","けんつめし", 21 "Rorapolon","焼き鳥","ユイヒイロ","Blossom","kk19212", 22 "れいや","HANE×HANE","Lewis","ピラメキ","天ぷら","Scott"] 23 24# 選手の基本情報を取得 25def general_info(name): 26 target_api = URL + "/players/" 27 playerTag = dic[name] 28 url = target_api+playerTag 29 headers = { 30 "content-type": "application/json; charset=utf-8", 31 "cache-control": "max-age=60", 32 "authorization": "Bearer %s" % access_key} 33 r = requests.get(url,headers=headers) 34 data = r.json() 35 return data 36 37__name__ == '__general_info__' 38 39 40# 選手の対戦情報を取得 41def battle_info(name): 42 target_api = URL + "/players/" 43 playerTag = dic[name] 44 url = target_api+playerTag+"/battlelog" 45 headers = { 46 "content-type": "application/json; charset=utf-8", 47 "cache-control": "max-age=60", 48 "authorization": "Bearer %s" % access_key} 49 r = requests.get(url,headers=headers) 50 data = r.json() 51 return data 52 53__name__ == '__battle_info__' 54 55 56# 自分のデッキリストを作成(変数は選手名と何番目のデッキか)) 57def selfdeck_list(name,newnum): 58 #decktype = battle_info(name)[0]["type"] 59 #cardsname = battle_info(name)[0]["team"][0]["cards"][1]["name"] 60 61 # 普通の書き方バージョン 62 decklist = [] 63 64 for decknum in range(0,25): 65 decktype = battle_info(name)[decknum]["type"] 66 67 for numindeck in range(0,8): 68 cardsname = battle_info(name)[decknum]["team"][0]["cards"][numindeck]["name"] 69 decklist.append(cardsname) 70 71 """内包表記バージョン? 72 decklist = [ battle_info(name)[decknum]["team"][0]["cards"][numindeck]["name"] for decknum in range(0,25) for numindeck in range(0,8) ] 73 decktype = [ battle_info(name)[decknum]["type"] for decknum in range(0,25)]""" 74 75 return decktype[int(newnum)] 76 return decklist[int(newnum*8):int(newnum*8+8)] 77 78 79selfdeck_list("Scott",0) 80 81 82# 対戦相手のデッキリストを作成(変数は選手名と何番目のデッキか) 83def opponentdeck_list(name, newnum): 84 #decktype = battle_info(name)[0]["type"] 85 #cardsname = battle_info(name)[0]["team"][0]["cards"][1]["name"] 86 # 1つ目の[]は何試合目か、3つ目は8個の中の何番目 87 88 """ 普通バージョン 89 decklist = [] 90 91 for decknum in range(0,25): 92 decktype = battle_info(name)[decknum]["type"] 93 94 for numindeck in range(0,8): 95 cardsname = battle_info(name)[decknum]["opponent"][0]["cards"][numindeck]["name"] 96 decklist.append(cardsname)""" 97 98 #内包表記バージョン? 99 100 decklist = [ battle_info(name)[decknum]["opponent"][0]["cards"][numindeck]["name"] for decknum in range(0,25) for numindeck in range(0,8) ] 101 decktype = [ battle_info(name)[decknum]["type"] for decknum in range(0,25)] 102 103 return [decktype[int(newnum)], decklist[int(newnum*8):int(newnum*8+8)]] 104 105 106 107#2. デッキのdateframe作成 108""" 109columns1 = ["対戦種類","自デッキ","敵デッキ","勝敗"] 110 111for number in range(0,25): 112 player = "Scott" 113 datas = selfdeck_list(player,number),opponentdeck_list(player,number) 114 115deckdata = pd.DateFrame(data=datas,index=number,columns=columns1 ) 116 117print(deckdata) 118""" 119 120 121#3. datesetの中に入れ、DateFrameを作成 122""" 123columns2 = ["クラン","タグ","現在トロ","最多トロ","チャレンジ名","デッキ"] 124 125for player in list: 126 dataset = general_info(player)["tag"],dic[player],general_info(player)["trophies"],general_info(player)["bestTrophies"],battle_info(player,0) 127 128generaldata = pd.DateFrame(data=dateset,index=list,columns=columns2) 129print(generaldata) 130""" 131
回答2件
あなたの回答
tips
プレビュー