マルチスレッドでの走行速度を高めるためのforループのpython3代替

[この記事では、ブログの雲が所有する公園外の日が来ます]

次のように古いものと新しいコードの最適化の前と後に、次のとおりです。

git_tools.git_toolのインポートget_collect_projects、QQNews_Git
 からスレッドインポートスレッド、ロック
 インポート日時

BASE_URL = " http://git.xx.com " 
project_members_commits_lang_info = {} 
ロック = ロック()
スレッド = [] 

''」
著者:zenkilan 
'' 「


DEF count_time(FUNC):
     デフ took_up_time(* argsを、** kwargsから):
        START_TIME = datetime.datetime.now()
        RET = FUNC(* argsを、**kwargsから)
        END_TIME = datetime.datetime.now()
        took_up_time =(END_TIME - START_TIME).total_seconds()
         プリント(F " {FUNC .__ name__}実行時間取り上げ:{took_up_time} " リターンRETの

    戻りtook_up_timeの


デフget_project_member_lang_code_lines(gitのを、部材、BEGIN_DATE、END_DATE):
     グローバルproject_members_commits_lang_info
     グローバルロック
    MEMBER_NAME =部材[ " ユーザ名" ] 
    、R = git.get_user_info(MEMBER_NAME)
    なら ない R [ " ID " :]
         リターン
    user_commits_lang_info = git.get_commits_user_lang_diff_between(R [ " ID " ]、BEGIN_DATE、END_DATE)
     場合 LEN(user_commits_lang_info)== 0:
         リターン
    lock.acquire()
    project_members_commits_lang_info.setdefault(git.project、辞書())
    project_members_commits_lang_info [git.project] [MEMBER_NAME] = user_commits_lang_info 
    lock.release()


DEF get_project_lang_code_lines(プロジェクト、BEGIN_DATE、END_DATE):
     グローバルスレッド
    のgitQQNews_Git =(プロジェクト[1 ]、BASE_URL、プロジェクト[0])
    project_members = git.get_project_members()
     IFでlen(project_members)== 0:
         復帰
    用のメンバーproject_members:
        スレッド =スレッド(目標= get_project_member_lang_code_lines、引数の= (Gitの、部材、BEGIN_DATE、END_DATE))
        threads.append(スレッド)
        Thread.start()


@count_timeの
DEFのget_projects_lang_code_lines(BEGIN_DATE、END_DATE):
     "" " 
    関連する統計線コード言語へのアクセス-効率を改善するための新しい方法()
    マルチスレッドの代替ループの
    共有、外部リソースへの同時アクセス
    の復帰:
    「」」
    、株式会社参加無料project_members_commits_lang_info
     、株式会社フリーは参加スレッド
     のためのプロジェクト:get_collect_projects()
        スレッド =スレッド(対象= get_project_lang_code_lines、引数= (プロジェクト、BEGIN_DATE、END_DATE))
        threads.append(スレッド)
        Thread.start()


@count_time 
DEF get_projects_lang_code_lines_old(BEGIN_DATE、END_DATEを):
     " 「」
    ラインコード関連する統計的言語を取得- (重度の処理された)古い方法
    プログラミングするための基本的な考え方使用
    操作を消費し、各収容するための二重入れ子ループを
    :リターン:
    「」 " 
    project_members_commits_lang_info = {}
     ためプロジェクトget_collect_projects():
        gitの = QQNews_Git(プロジェクト[1 ]、BASE_URL、プロジェクト[0])
        project_members = git.get_project_members()
        user_commits_lang_info_dict = {}
         場合でlen(project_members)== 0:
             続ける
        ための部材project_members:
            MEMBER_NAME =メンバー[ " ユーザ名" ] 
            、R = git.get_user_info(MEMBER_NAME、デバッグ= 偽)
             なら ない R [ " ID " ]:
                引き続き
            試み
                user_commits_lang_info = git.get_commits_user_lang_diff_between(R [ " ID " ]、BEGIN_DATE、END_DATE)
                 場合でlen(user_commits_lang_infoに)== 0:
                     継続
                [MEMBER_NAME] user_commits_lang_info_dictを = user_commits_lang_info 
                project_members_commits_lang_info [git.project] = user_commits_lang_info_dictを
             除い渡す
    リターンproject_members_commits_lang_info 


DEF test_results_equal(resultA、resultB):
    "" " 
    测试方法
    :PARAM resultA:
    :PARAM resultB: リターン
    """ 
    印刷(resultA)
     プリント(resultB)
     アサート LEN(文字列(resultA))== LEN(文字列(resultB))


であれば __name__ == " __main__ ' から git_tools.configのインポートBEGIN_DATE、END_DATE 

    get_projects_lang_code_lines(BEGIN_DATE、END_DATE)
    のために T におけるスレッド:
        t.join()
    old_result = get_projects_lang_code_lines_old(BEGIN_DATE、END_DATE) 
    test_results_equal(old_result、project_members_commits_lang_info)

外側のループ中に古いものとが存在している操作を消費するための内部ループのための方法:

1)git.get_project_members()

2)git.get_user_info(MEMBER_NAME、デバッグ=偽)

外部から内部への後、または外部の最初の数年間を最適化するための2つのステップが行います。矛盾する書き込みロックを回避するために、外部リソースの同時共有するための交換サイクルをマルチスレッド。

テスト結果、装飾ディスプレイ(秒)の時間の関数:

1.85294:get_projects_lang_code_linesの実行には時間を取りました

get_projects_lang_code_lines_old実行は時間を取った:108.604177

約58倍の高速化

おすすめ

転載: www.cnblogs.com/LanTianYou/p/11498525.html