python for循环优化_Python3用多线程替代for循环提升程序运行速度

from git_tools.git_tool importget_collect_projects, QQNews_Gitfrom threading importThread, Lockimportdatetime

base_url= "http://git.xx.com"project_members_commits_lang_info={}

lock=Lock()

threads=[]'''Author:zenkilan'''

defcount_time(func):def 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()print(f"{func.__name__} execution took up time:{took_up_time}")returnretreturntook_up_timedefget_project_member_lang_code_lines(git, member, begin_date, end_date):globalproject_members_commits_lang_infogloballock

member_name= member["username"]

r=git.get_user_info(member_name)if not r["id"]:returnuser_commits_lang_info= git.get_commits_user_lang_diff_between(r["id"], begin_date, end_date)if len(user_commits_lang_info) ==0:returnlock.acquire()

project_members_commits_lang_info.setdefault(git.project, dict())

project_members_commits_lang_info[git.project][member_name]=user_commits_lang_info

lock.release()defget_project_lang_code_lines(project, begin_date, end_date):globalthreads

git= QQNews_Git(project[1], base_url, project[0])

project_members=git.get_project_members()if len(project_members) ==0:return

for member inproject_members:

thread= Thread(target=get_project_member_lang_code_lines, args=(git, member, begin_date, end_date))

threads.append(thread)

thread.start()

@count_timedefget_projects_lang_code_lines(begin_date, end_date):"""获取项目代码行语言相关统计——新方法(提升效率)

应用多线程替代for循环

并发访问共享外部资源

:return:"""

globalproject_members_commits_lang_infoglobalthreadsfor project inget_collect_projects():

thread= Thread(target=get_project_lang_code_lines, args=(project, begin_date, end_date))

threads.append(thread)

thread.start()

@count_timedefget_projects_lang_code_lines_old(begin_date, end_date):"""获取项目代码行语言相关统计——老方法(耗时严重)

使用最基本的思路进行编程

双层for循环嵌套并且每层都包含耗时操作

:return:"""project_members_commits_lang_info={}for project inget_collect_projects():

git= QQNews_Git(project[1], base_url, project[0])

project_members=git.get_project_members()

user_commits_lang_info_dict={}if len(project_members) ==0:continue

for member inproject_members:

member_name= member["username"]

r= git.get_user_info(member_name, debug=False)if not r["id"]:continue

try:

user_commits_lang_info= git.get_commits_user_lang_diff_between(r["id"], begin_date, end_date)if len(user_commits_lang_info) ==0:continueuser_commits_lang_info_dict[member_name]=user_commits_lang_info

project_members_commits_lang_info[git.project]=user_commits_lang_info_dictexcept:pass

returnproject_members_commits_lang_infodeftest_results_equal(resultA, resultB):"""测试方法

:param resultA:

:param resultB:

:return:"""

print(resultA)print(resultB)assert len(str(resultA)) ==len(str(resultB))if __name__ == '__main__':from git_tools.config importbegin_date, end_date

get_projects_lang_code_lines(begin_date, end_date)for t inthreads:

t.join()

old_result=get_projects_lang_code_lines_old(begin_date, end_date)

test_results_equal(old_result, project_members_commits_lang_info)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值