0

purchase_state以下の手順に従って、Google Play からを抽出しようとしています。

    import base64
    import requests
    import smtplib
    from collections import OrderedDict
    import mysql.connector
    from mysql.connector import errorcode
    ......
  1. purchase_iddb をクエリし、テーブルからフィールドを含む数千行を返します
  2. db から各行を確認し、 purchase_id を抽出してから、それらすべてについて Google Play にクエリを実行します。たとえば、前のステップの結果が 1000 の場合、1000 回は Google へのクエリ (リフレッシュ トークン + クエリ) です。
  3. purchase statusmysql クエリから取得される他のフィールドとは別に、Google Play から新しいフィールドを新しい辞書に追加します。
  4. 最後のステップは、次のように私のディックをループして、望ましいレポートを準備することです

編集後:

def build_dic_from_db(data,access_token):
dic = {}
for row in data:

    product_id = row['product_id']
    purchase_id = row['purchase_id']
    status = check_purchase_status(access_token, product_id,purchase_id)
    cnt = 1

    if row['user'] not in dic:
        dic[row['user']] = {'id':row['user_id'],'country': row['country_name'],'reg_ts': row['user_registration_timestamp'],'last_active_ts': row['user_last_active_action_timestamp'],
                            'total_credits': row['user_credits'],'total_call_sec_this_month': row['outgoing_call_seconds_this_month'],'user_status':row['user_status'],'mobile':row['user_mobile_phone_number_num'],'plus':row['user_assigned_msisdn_num'],
                            row['product_id']:{'tAttemp': cnt,'tCancel': status}}
    else:
        if row['product_id'] not in dic[row['user']]:
            dic[row['user']][row['product_id']] = {'tAttemp': cnt,'tCancel':status}
        else:
            dic[row['user']][row['product_id']]['tCancel'] += status
            dic[row['user']][row['product_id']]['tAttemp'] += cnt
return dic

問題は、コードの動作が遅いことです ~ 合計実行時間: 448.7483880519867 スクリプトを改善する方法があるかどうか疑問に思っています。何か提案はありますか?

4

1 に答える 1

1

これが正しいことを願っていますが、ボトルネックはプレイストアへの接続にあるようです. サーバーは一度に 100 万件のリクエストを処理できますが、順次実行すると時間がかかります。エグゼキュータを使用してジョブを処理する方法を次に示します (「同時実行」パッケージをインストールする必要があります)。この例では、同時に 100 のリクエストを送信できます。

from concurrent import futures
EXECUTORS = futures.ThreadPoolExecutor(max_workers=100)
jobs = dict()
for row in data:

   product_id = row['product_id']
   purchase_id = row['purchase_id']
   job = EXECUTORS.submit(check_purchase_status,
access_token, product_id,purchase_id)
   jobs[job] = row

for job in futures.as_completed(jobs.keys()):
   # here collect your results and do something useful with them :)
   status = job.result()
   # make the connection with current row
   row = jobs[job]
   # now you have your status and the row

ところで、一時変数を使用しようとするか、同じキーを使用して辞書に常にアクセスしています。これは、コードのパフォーマンスと読みやすさにとって良くありません。

于 2016-06-17T10:52:08.183 に答える