优化前后新老代码如下:

from git_tools.git_tool import get_collect_projects, QQNews_Git

from threading import Thread, Lock

import datetime

base_url = "http://git.xx.com"

project_members_commits_lang_info = {}

lock = Lock()

threads = []

'''

Author:zenkilan

'''

def count_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}")

return ret

return took_up_time

def get_project_member_lang_code_lines(git, member, begin_date, end_date):

global project_members_commits_lang_info

global lock

member_name = member["username"]

r = git.get_user_info(member_name)

if not r["id"]:

return

user_commits_lang_info = git.get_commits_user_lang_diff_between(r["id"], begin_date, end_date)

if len(user_commits_lang_info) == 0:

return

lock.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()

def get_project_lang_code_lines(project, begin_date, end_date):

global threads

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

project_members = git.get_project_members()

if len(project_members) == 0:

return

for member in project_members:

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

threads.append(thread)

thread.start()

@count_time

def get_projects_lang_code_lines(begin_date, end_date):

"""

获取项目代码行语言相关统计——新方法(提升效率)

应用多线程替代for循环

并发访问共享外部资源

:return:

"""

global project_members_commits_lang_info

global threads

for project in get_collect_projects():

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

threads.append(thread)

thread.start()

@count_time

def get_projects_lang_code_lines_old(begin_date, end_date):

"""

获取项目代码行语言相关统计——老方法(耗时严重)

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

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

:return:

"""

project_members_commits_lang_info = {}

for project in get_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 in project_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:

continue

user_commits_lang_info_dict[member_name] = user_commits_lang_info

project_members_commits_lang_info[git.project] = user_commits_lang_info_dict

except:

pass

return project_members_commits_lang_info

def test_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 import begin_date, end_date

get_projects_lang_code_lines(begin_date, end_date)

for t in threads:

t.join()

old_result = get_projects_lang_code_lines_old(begin_date, end_date)

test_results_equal(old_result, project_members_commits_lang_info)

老方法里外层for循环和内层for循环里均存在耗时操作:

1)git.get_project_members()

2)git.get_user_info(member_name, debug=False)

分两步来优化,先里后外或先外后里都行。用多线程替换for循环,并发共享外部资源,加锁避免写冲突。

测试结果通过,函数运行时间装饰器显示(单位秒):

get_projects_lang_code_lines execution took up time:1.85294

get_projects_lang_code_lines_old execution took up time:108.604177

速度提升了约58倍

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: Python3如何使用多线程升程序运行速度

本文地址: http://www.cppcns.com/jiaoben/python/332829.html

python多线程提高速度_Python3如何使用多线程升程序运行速度相关推荐

  1. excel连接mysql速度太慢_Excel 一句话让程序运行速度提高了几百倍(recordset的CursorLocation属性)...

    因工作需要,用EXCEL+ADO+SQL SERVER编写了一个加班工资录入的小程序.写好后进行了一些测试,因测试数据不多,没发现有什么问题.这个月正式用这个程序来计算加班工资并上传,一共1000多条 ...

  2. python多进程和多线程一起使用_Python3多进程与多线程区别及使用(2.线程)

    threading模块 简述: threading模块 threading.currentThread(): 返回当前的线程变量. threading.enumerate(): 返回一个包含正在运行的 ...

  3. 如何使用python多线程_Python3如何使用多线程升程序运行速度

    优化前后新老代码如下: from git_tools.git_tool import get_collect_projects, QQNews_Git from threading import Th ...

  4. python服务器qt客户端_python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例...

    本文在上文的基础上重新实现支持多线程的服务器. 以下为TCP客户端的程序代码: #!/usr/bin/env python3 import sys from PyQt5.QtCore import ( ...

  5. python3多线程异步爬虫_python3爬虫中多线程进行解锁操作实例

    生活中我们为了保障房间里物品的安全,所以给门进行上锁,在我们需要进入房间的时候又会重新打开.同样的之间我们讲过多线程中的lock,作用是为了不让多个线程运行是出错所以进行锁住的指令.但是鉴于我们实际运 ...

  6. python多线程实现方法_Python3 多线程的两种实现方式

    最近学习 Python3 ,希望能掌握多线程的使用,在此做个笔记.同时也希望Python 牛人指点错误.关于线程的概念,前面简单总结了一下 java 的多线程,传送门:java 多线程概念,三种创建多 ...

  7. python多程优化_Python 基本功: 13. 多线程运算提速

    小编在前两天开通了一个 Python 金融的专栏,顺便用 TuShare 下载了几只 A股的数据,有兴趣的小伙伴可以去看一下: 多多教Python:Python 金融: TuShare API 获取股 ...

  8. Python第十二章-多进程和多线程01-多进程

    多进程和多线程 一.进程 1.1 进程的引入 现实生活中,有很多的场景中的事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的:试想,如果把唱歌和跳舞这2件事情分开依次 ...

  9. python 加快计算速度_python怎么提高计算速度

    下面是python中的一个函数计算代码: loops=25000000 from math import* a=range(1,loops) def f(x): return 3*cos(x)+4*s ...

最新文章

  1. 512张GPU炼出10万亿参数巨模型!5个月后达摩院模型再升级,今年双十一已经用上了...
  2. 三个小命令检查电脑!
  3. kettle于javascript步骤错误处理
  4. SAP WebIDE里UI5应用的隐藏文件project.json
  5. JS之四舍五入Fixed
  6. 以下哪个不是有效的java变量名,Java程序设计-中国大学mooc-题库零氪
  7. MySql数据库连接种类
  8. SQL Sever sa密码丢失
  9. Mac/Linux 安装联邦学习 Fate 框架单机部署所需的依赖(填坑大全)
  10. 安装oracle10g程序异常终止,win7系统安装oracle10g提示程序异常终止的解决方法
  11. shell基础之pxe批量部署
  12. 根据日志统计出每个用户在站点所呆时间最长的前2个的信息
  13. 光伏发电系统最大功率点跟踪MPPT matlab/simulink仿真 扰动观察法
  14. mysql查询学生成绩语句_SQL查询成绩之精典语句
  15. 如何让网站很快被百度收录?
  16. Visual Studio 2019 企业版 16.9.x 创建离线包并安装教程(带百度网盘下载地址和序列号)
  17. 微信 Android 热补丁实践演进之路
  18. 虚拟机安装Windows7系统(亲测超详细)
  19. torch.repeat()
  20. 视频基础知识—720P/1080i/1080P

热门文章

  1. V4L2 获取设备支持的分辨率
  2. 如何成为一名真正专业的程序员
  3. mysql之分页查询
  4. android预览界面显示不全,Android SurfaceView Camera 预览显示不全(画面拉伸)
  5. 安装pkgconfig_一个R包怎么也安装不上,憋着急!
  6. 语言题库安装包312mb_大学为什么要考取计算机二级,以后很需要,附二级Msoffice题库...
  7. acs880变频器选型手册_变频器是否需要加进线、出线电抗器?
  8. mysql中的substring()截取字符函数
  9. 计算机网络实验【利用wireshark抓包工具抓包】
  10. mysql navicat 多语句_使用Navicat多对多关系SQL语句在MySQL中实现