python多线程提高速度_Python3如何使用多线程升程序运行速度
优化前后新老代码如下:
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如何使用多线程升程序运行速度相关推荐
- excel连接mysql速度太慢_Excel 一句话让程序运行速度提高了几百倍(recordset的CursorLocation属性)...
因工作需要,用EXCEL+ADO+SQL SERVER编写了一个加班工资录入的小程序.写好后进行了一些测试,因测试数据不多,没发现有什么问题.这个月正式用这个程序来计算加班工资并上传,一共1000多条 ...
- python多进程和多线程一起使用_Python3多进程与多线程区别及使用(2.线程)
threading模块 简述: threading模块 threading.currentThread(): 返回当前的线程变量. threading.enumerate(): 返回一个包含正在运行的 ...
- 如何使用python多线程_Python3如何使用多线程升程序运行速度
优化前后新老代码如下: from git_tools.git_tool import get_collect_projects, QQNews_Git from threading import Th ...
- python服务器qt客户端_python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例...
本文在上文的基础上重新实现支持多线程的服务器. 以下为TCP客户端的程序代码: #!/usr/bin/env python3 import sys from PyQt5.QtCore import ( ...
- python3多线程异步爬虫_python3爬虫中多线程进行解锁操作实例
生活中我们为了保障房间里物品的安全,所以给门进行上锁,在我们需要进入房间的时候又会重新打开.同样的之间我们讲过多线程中的lock,作用是为了不让多个线程运行是出错所以进行锁住的指令.但是鉴于我们实际运 ...
- python多线程实现方法_Python3 多线程的两种实现方式
最近学习 Python3 ,希望能掌握多线程的使用,在此做个笔记.同时也希望Python 牛人指点错误.关于线程的概念,前面简单总结了一下 java 的多线程,传送门:java 多线程概念,三种创建多 ...
- python多程优化_Python 基本功: 13. 多线程运算提速
小编在前两天开通了一个 Python 金融的专栏,顺便用 TuShare 下载了几只 A股的数据,有兴趣的小伙伴可以去看一下: 多多教Python:Python 金融: TuShare API 获取股 ...
- Python第十二章-多进程和多线程01-多进程
多进程和多线程 一.进程 1.1 进程的引入 现实生活中,有很多的场景中的事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的:试想,如果把唱歌和跳舞这2件事情分开依次 ...
- python 加快计算速度_python怎么提高计算速度
下面是python中的一个函数计算代码: loops=25000000 from math import* a=range(1,loops) def f(x): return 3*cos(x)+4*s ...
最新文章
- 512张GPU炼出10万亿参数巨模型!5个月后达摩院模型再升级,今年双十一已经用上了...
- 三个小命令检查电脑!
- kettle于javascript步骤错误处理
- SAP WebIDE里UI5应用的隐藏文件project.json
- JS之四舍五入Fixed
- 以下哪个不是有效的java变量名,Java程序设计-中国大学mooc-题库零氪
- MySql数据库连接种类
- SQL Sever sa密码丢失
- Mac/Linux 安装联邦学习 Fate 框架单机部署所需的依赖(填坑大全)
- 安装oracle10g程序异常终止,win7系统安装oracle10g提示程序异常终止的解决方法
- shell基础之pxe批量部署
- 根据日志统计出每个用户在站点所呆时间最长的前2个的信息
- 光伏发电系统最大功率点跟踪MPPT matlab/simulink仿真 扰动观察法
- mysql查询学生成绩语句_SQL查询成绩之精典语句
- 如何让网站很快被百度收录?
- Visual Studio 2019 企业版 16.9.x 创建离线包并安装教程(带百度网盘下载地址和序列号)
- 微信 Android 热补丁实践演进之路
- 虚拟机安装Windows7系统(亲测超详细)
- torch.repeat()
- 视频基础知识—720P/1080i/1080P
热门文章
- V4L2 获取设备支持的分辨率
- 如何成为一名真正专业的程序员
- mysql之分页查询
- android预览界面显示不全,Android SurfaceView Camera 预览显示不全(画面拉伸)
- 安装pkgconfig_一个R包怎么也安装不上,憋着急!
- 语言题库安装包312mb_大学为什么要考取计算机二级,以后很需要,附二级Msoffice题库...
- acs880变频器选型手册_变频器是否需要加进线、出线电抗器?
- mysql中的substring()截取字符函数
- 计算机网络实验【利用wireshark抓包工具抓包】
- mysql navicat 多语句_使用Navicat多对多关系SQL语句在MySQL中实现