当前位置: 首页 > news >正文

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(),它可以把一个字符串直接变成变量,有了这个方法,批量导入就彻底完活了,既可以借助多线程(多进程)批量导入,也可以按照原来的方式直接用,对程序的带动很小,简直完美。

        

http://www.lryc.cn/news/173278.html

相关文章:

  • 齿轮减速机设备类网站pbootcms模板(PC端+手机端自适应)
  • MySQL报错:this is incompatible with sql_mode=only_full_group_by 解决方法
  • impala常用时间函数,date->string->timestamp互转
  • 无源供电无线测温系统的应用意义
  • 使用 PyTorch 的计算机视觉简介 (1/6)
  • 用PHP实现极验验证功能
  • 【数据结构初阶】三、 线性表里的链表(无头+单向+非循环链表)
  • Mybatis 映射器与XML配置职责分离
  • 微服务引擎
  • 前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS基础(三)
  • 搭建部署属于自己的基于gpt3.5的大语言模型(基于flask+html+css+js+mysql实现)
  • AI创作专家,免费的AI创作专家工具
  • Nginx之gzip模块解读
  • 微软在Windows 11推出Copilot,将DALL-E 3集成在Bing!
  • SLAM从入门到精通(消息传递)
  • 思科路由器:NAT的基础配置
  • 动态代理。
  • Learn Prompt-GPT-4:能力
  • iOS——ViewController的生命周期
  • SkyWalking内置参数与方法
  • 【C++面向对象侯捷】12.虚函数与多态 | 13.委托相关设计【设计模式 经典做法,类与类之间关联起来,太妙了,不断的想,不断的写代码】
  • 基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(五)
  • hive数据初始化
  • React+Node——next.js 构建前后端项目
  • CRM系统主要包括哪些功能?
  • Nginx location 精准匹配URL = /
  • 使用JAXB将Java对象转xml
  • Atlas 200 DK开发板问题总结
  • uniapp——实现二维码生成+保存二维码图片——基础积累
  • 零基础学前端(六)重点讲解 JavaScript