質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

458閲覧

【python】実行時間を早くできる箇所を教えてください。

mmtt

総合スコア23

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/05/15 02:08

編集2019/05/15 02:46

解決したいこと

初めてちゃんとしたコードを書いたのですが、実行に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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2019/05/15 02:18

せめて何をするコードなのか具体的に説明を添えてください。 また、ベンチマークツールで気になる部分の速度を調べてボトルネックを探してみてください。
can110

2019/05/15 02:28

具体的にコード上のどの部分で時間がかかっているかを追記ください。
mmtt

2019/05/15 02:50

すみません。追記しました。
guest

回答2

0

ベストアンサー

何度も同じデータが生成されているようですね。

  • return を2回書いてますが2回目は絶対に実行されません
  • YouheiSakuraiさんの回答にもあるように battle_info(name) は一度呼び出したら結果を変数に入れて使いましょう。
  • decktype 等はそのまま配列で返し、出来上がったリストのどの番号を使うかは関数外で指定しましょう。

python

1def selfdeck_list(name): 2 battle = battle_info(name) 3 4 内包表記バージョン? 5 decklist = [ battle[decknum]["team"][0]["cards"][numindeck]["name"] for decknum in range(0,25) for numindeck in range(0,8) ] 6 decktype = [ battle[decknum]["type"] for decknum in range(0,25)] 7 8 return (decklist, decktype) 9 10decklist, decktype = selfdeck_list("Scott") 11decktype[0]

投稿2019/05/15 05:00

編集2019/05/15 05:00
mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

battle_infoを呼び出す回数が多いのが原因だと思います。battle_info(name)の戻り値は変数に格納して使い回すと早くなると思います。

投稿2019/05/15 04:00

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問