0

以下のコードのidsは、フレンドリスト内のすべてのユーザーの steam64 ID を含む配列です。現在、Steam Web API ドキュメントによると、GetPlayerSummariesコンマで区切られた 100 個の steam64 ID のリストのみを受け取ります。一部のユーザーには 100 人以上の友人がいます。API を呼び出すたびに for ループを 200 回実行する代わりに、100 個のスチーム ID のセットで配列を取得したいと考えています。これを行う最も効率的な方法は何ですか (速度の点で)?

配列の最初の 100 要素を取得できることはわかっていますids[0:100]が、たとえば 230 人のユーザーのフレンドリストに対してこれを行うにはどうすればよいでしょうか?

def getDescriptions(ids):
    sids = ','.join(map(str, ids)) 
    r = requests.get('http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key='+API_KEY+'&steamids=' + sids)
    data = r.json();
...
4

2 に答える 2

0

この回答のコードを利用すると、これを 100 (または最後のループの場合はそれ以下) の友人のグループに分割できます。

def chunkit(lst, n):
    newn = int(len(lst)/n)
    for i in xrange(0, n-1):
        yield lst[i*newn:i*newn+newn]
    yield lst[n*newn-newn:]


def getDescriptions(ids):
    friends = chunkit(ids, 3)
    while (True):
        try:
            fids = friends.next()
            sids = ','.join(map(str, fids)) 
            r = requests.get('http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key='+API_KEY+'&steamids=' + sids)
            data = r.json()
            # Do something with the data variable
        except StopIteration:
            break

これにより、3 つのグループ ( の 2 番目のパラメーター) に分割された反復子が作成されますchunkit。フレンド リストの基本サイズが 250 であるため、3 を選択しました。それ以上の数を取得することもできますが (この記事のルール)、開始するのに安全な場所です。必要に応じて、その値を微調整できます。

この方法を利用するdataと、ループごとに値が上書きされます。指定された場所で必ず何かをしてください。

于 2014-10-27T17:26:40.597 に答える
-1

簡単な代替手段があります。それぞれのリストのサイズをwhile/loop使い果たすまで減らすだけです。

def getDescriptions(ids):
    sids = ','.join(map(str, ids))
    sids_queue = sids.split(',')
    data = []
    while len(sids_queue) != 0:
        r = requests.get('http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key='+ \
                            API_KEY+'&steamids=' + ','.join(sids_queue[:100])
        data.append(r.json) # r.json without (), by the way
        # then skip [0:100] and reassign to sids_queue, you get the idea
        sids_queue = sids_queue[101:]
于 2014-10-27T17:31:33.987 に答える