python中使用多线程批量导入包

 问题放到前面,目前发现一个问题,importlib对于c/c++编译过来的包,只支持导入最顶层的包,不过也够了。

        因为有些项目的依赖太多,所以导致每个文件头部都包含大量import语句,用来导入必要的包,如果量不多,这样的话对启动的速度影响不是很明显,但是如果导入的包非常多,各个文件还有重复的导入,那样就会导致程序的启动时间大大加长,特别像带界面的程序,程序还什么都没干,就要耗费5-6秒的时间启动,这实在是无法接受的。主要是当时开发功能的时候没有考虑这么多,甚至没想到包的导入对启动速度的影响会这么明显,在这种情况下,导致我必须优化一下。

        优化这块,其实之前也想了不少办法,但之前的方向是错误的,之前我根本没想到是包的导入浪费了5-6秒的时间,我一直以为是python打包后就应该这么慢,所以我之前一直努力的方向是把python编译成更底层的代码以优化速度,但是用其它的打包工具试过以后,并没有明显的改善,所以曾一度放弃优化,这次再一次想优化是因为前几天给同事展示功能的时候,同事随口一说,怎么这么慢,再次刺激到我,所以决定再一次优化,这次之所以想到是导入包的问题,也是突然想到之前有的那种cpp编译的pyd导入的时候是肉眼可见的慢,于是试着往这个方向努力,结果真的是包导入的问题。

        经过百度,这块还真有资料,其中有个可以应用的方法是多线程(多进程)导入包,原理就是使用importlib模块结合多线程(多进程)批量导入包,原理不难理解,但是发现一个问题,就是importlib这个模块的用法大概是这样

from importlib import import_module
time = import_moduel('time')

如果用多线程,大概是这样

def my_import(module_name):from importlib import import_modulereturn import_modulefrom concurrent import futures
module_list = ['time','os','sys']
with futures.ThreadPoolExecutor(3) as executor:# with语句会调用executor.shutdown(wait=True),在所有线程都执行完毕前阻塞当前线程res = executor.map(my_import,module_list)

首先import_module函数必须有个变量接收导入的模块名,但是多线程导入没有变量接收导入的模块名,导致虽然导入了,但是没法用,所以必须有变量去接受,最直接的办法就是放到list或者字典,但是这样用的时候不如原生导入那样方便,用list每次必须带索引,用字典每次都要用字典那种key的形式,我觉得都不够简洁,我最期望的效果还是跟原来一样,导入完直接就是一个变量,用的时候直接用,那么其实就是需要一种能动态生成变量的技术,而且生成的是普通变量,而不是list,dict这种,并且还要暴露在本地名字空间里,就是说我可以直接用,怎么做呢,经过搜索,发现python确实有解决方案,那就是locals()或者globals(),它可以把一个字符串直接变成变量,有了这个方法,批量导入就彻底完活了,既可以借助多线程(多进程)批量导入,也可以按照原来的方式直接用,对程序的带动很小,简直完美,修改完的代码大概长这样

from concurrent import futures
module_list = ['time','sys','os',
]
name_list = ['time','sys','os']
def my_import(i):from importlib import import_moduleglobals()[name_list[i]] = import_module(module_list[i])
with futures.ThreadPoolExecutor(3) as executor:# with语句会调用executor.shutdown(wait=True),在所有线程都执行完毕前阻塞当前线程res = executor.map(my_import,range(0, 57))

   name_list是导入之后的名字,module_list是原始的模块名字。     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端第二课,HTML,alt,title,width/heigh,border,<a>超链接,target,tr,td,th

目录 一、title: 💛 ​二、alt💙 三、width/heigh💜 四、border ❤️ 五、超链接💚 六、target 💗 七、tr💕 八、td💘 九、th💞 十、rowspan 一、title: 💛 快…

js-cookie使用 js深度克隆(判断引用类型是数组还是对象的方法)

cookie和深度拷贝的使用 1、js-cookie使用2、js深度克隆 1、js-cookie使用 前端的本地存储分为 localstorage、sesstionstorage、cookie 但是咱们有时候需要做7天免登录的需求时,选择 cookie 作为前端的本地存储是在合适不过的了 直接操作 cookie 可以, …

名义实际GDP-各地区-原始和结果(2000-2022年)

一、数据介绍 数据名称:名义、实际GDP-各地区-原始和结果 数据年份:2000-2022年 计算公式:实际GDP 名义GDP / GDP折算指数 数据基期:2000年 数据整理:自主整理 二、数据用途 数据用途 文献依据 经济发展水平 …

Docker一键安装和基本配置

一键安装脚本 注:该脚本需要root权限 curl -sSL https://get.docker.com/ | sh非root组用户赋权 sudo groupadd docker # 若使用一键安装脚本会自动创建这个组,提示已存在 sudo gpasswd -a ${USER} docker # 将当前用户添加到docker组,也…

【笔记】ubuntu 20.04 + mongodb 4.4.14定时增量备份脚本

环境 ubuntu 20.04mongodb 4.4.14还没实际使用(20230922)后续到10月底如果有问题会修改 原理 只会在有新增数据时生成新的备份日期目录备份恢复时,如果恢复的数据库未删除,则会覆盖数据 准备 准备一个文件夹,用于…

Kuboard突然无法访问提示:Failed to connect to the database

一、背景 没有做任何特殊操作,突然kuboard访问时,提示如下信息: {"message": "Failed to connect to the database.","type": "Internal Server Error" }二、排查过程 此处kuboard为docker部署的…

python经典百题之删除指定字母

题目:删除一个字符串中的指定字母,如:字符串 “aca”,删除其中的 a 字母 程序分析 我们需要编写一个程序,删除字符串中的指定字母。给定一个字符串和要删除的字母,我们需要将字符串中的指定字母全部删除。…

Github 快速访问常见方法

一、使用镜像网站 这里提供最常用的镜像地址,镜像就是一个克隆版的网站,你可以访问这些镜像网站,网站的内容跟 GitHub 是完整同步的内容,然后在这个网站里面进行下载克隆等操作。 https://githubfast.comhttps://hub.njuu.cf/ht…

基于Vue+ELement搭建登陆注册页面实现后端交互

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《ELement》。🎯🎯 &#x1…

【C++心愿便利店】No.6---C++之拷贝构造函数

文章目录 一、拷贝构造函数的引入二、拷贝构造函数 👧个人主页:小沈YO. 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 📋专栏:C 心愿便利店 🔑本章内容:拷贝构造函数 记得 评…

华为OD:跳房子I

题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏。 游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格 跳房子的过程中,可以向前跳,也可以向后跳。 假设房子的总格数是count,小红每回合可能连续跳的…

数据结构入门-14-排序

一、选择排序 1.1 选择排序思想 先把最小的元素拿出来 剩下的,再把最小的拿出来 剩下的,再把最小的拿出来 但是这样 空间复杂度是O(n) 优化一下,希望原地排序 1.1.2 选择原地排序 索引i指向0的位置 索引j指向i1的元素 j 后面的元素遍历&…

Excel 语法

目录 语法 逐步创建公式 对单元格使用公式 另一个例子 语法 Excel中的一个公式用于进行数学计算。公式总是以单元格中键入的等号开头,然后是您的计算。 注意:您可以通过选择单元格并键入等号()来声明该单元格 逐步创建公式…

用PHP实现极验验证功能

极验验证是一种防机器人的验证机制,可以通过图像识别等方式来判断用户是否为真实用户。在实现极验验证功能时,您需要进行以下步骤: 1 注册极验账号: 首先,您需要在极验官网注册账号并创建一个应用,获取相应…

【Linux环境安装教程】

对于科班学生来讲,是不是学到哪门专业课都是需要安装环境的,本篇文章分享一下安装Linux环境的过程。 步骤: 1.准备安装所需要的工具 (1)安装Centos7镜像 这里呢,由于小编在所报的专业课班上听到老师讲过…

Linux——文件系统

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——文件系统 ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;上期我们了解了文件在内存中得组织方式&#xff0c;那么文件在磁盘中…

百度SEO优化技巧(选择、网站结构、内容优化、外链建设、数据分析)

百度关键词SEO优化介绍 SEO是搜索引擎优化的缩写&#xff0c;是指通过优化网站结构、内容和外部链接等方式&#xff0c;提高网站在搜索引擎中的排名&#xff0c;从而获取更多的访问量和流量。百度是中国最大的搜索引擎之一&#xff0c;对于企业来说&#xff0c;优化百度关键词…

7.4 通过API枚举进程权限

GetTokenInformation 用于检索进程或线程的令牌(Token)信息。Token是一个数据结构&#xff0c;其包含有关进程或线程的安全上下文&#xff0c;代表当前用户或服务的安全标识符和权限信息。GetTokenInformation函数也可以用来获取这些安全信息&#xff0c;通常用于在运行时检查某…

pymysql执行select查询操作

视频版教程 Python操作Mysql数据库之pymysql模块技术 pymysql执行DML语句 MySQL 数据库模块同样可以使用游标的execute()方法执行DML&#xff08;Data Manipulation Language, 数据操纵语言&#xff09;的 insert、update、delete语句&#xff0c;对数据库进行插入、修改和删…

在pandas中使matplotlib动态画子图的两种方法【推荐gridspec】

先上对比图&#xff0c; 第一种方法&#xff0c;这里仅展示1个大区&#xff0c;多个的话需要加一层循环就可以了&#xff0c;主要是看子图的画法 当大区下面的国家为1个或2个时&#xff0c;会进行报错 # 获取非洲国家列表 african_countries df[df[大区] 南亚大区][进口国…