[この記事では、ブログの雲が所有する公園外の日が来ます]
次のように古いものと新しいコードの最適化の前と後に、次のとおりです。
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倍の高速化