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(),它可以把一个字符串直接变成变量,有了这个方法,批量导入就彻底完活了,既可以借助多线程(多进程)批量导入,也可以按照原来的方式直接用,对程序的带动很小,简直完美。
相关文章:
python中使用多线程批量导入包
问题放到前面,目前发现一个问题,importlib对于c/c编译过来的包,只支持导入最顶层的包,不过也够了。 因为有些项目的依赖太多,所以导致每个文件头部都包含大量import语句,用来导入必要的包,如果量…...

齿轮减速机设备类网站pbootcms模板(PC端+手机端自适应)
齿轮减速机设备类网站pbootcms模板-手机端自适应,优化SEO效果 模板介绍: 这是一款基于PbootCMS内核开发的模板,专为机械设备和加工机械类企业设计。该模板具有简洁简单的页面设计,易于管理,同时还附带测试数据。通过使…...

MySQL报错:this is incompatible with sql_mode=only_full_group_by 解决方法
文章目录 项目场景:原因分析及解决方案:总结: 项目场景: 提示:这里简述项目相关背景: which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_f…...

impala常用时间函数,date->string->timestamp互转
impala 和hive不一样,hive是弱类型,比如int和string在大部分条件下可以比较 比如hive select 11 --结果true或false 但是impala select 11 报错 operands of type TINYINT and STRING are not comparable: 1 1 这样带来的好处是 类型一致结果更…...

无源供电无线测温系统的应用意义
电力系统设备在长期的运行中,往往会产生老化或过热现象,如果没有及时发现和解决,可能会造成严重的火灾事故。由于变电站设备地理位置偏远,对于其维护和监控,管理人员不能做到面面俱到,巡检和维护的难度较大…...

使用 PyTorch 的计算机视觉简介 (1/6)
一、说明 Computer Vision(CV)是一个研究计算机如何从数字图像和/或视频中获得一定程度的理解的领域。理解这个定义具有相当广泛的含义 - 它可以从能够区分图片上的猫和狗,到更复杂的任务,例如用自然语言描述图像。 二、CV常见的问…...

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

【数据结构初阶】三、 线性表里的链表(无头+单向+非循环链表)
相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 【数据结构初阶】二、 线性表里的顺序表_高高的胖子的博客-CSDN博客 引言 通过上期对顺序表的介绍和使用 我们可以知道顺序表有以下优点和缺点: 顺序表优点 尾插 和 尾…...

Mybatis 映射器与XML配置职责分离
之前我们介绍了使用XML配置方式完成对数据的增删改查操作,使用此方式在实际调用时需要使用【命名空间.标签编号】的方式执行,此方式在编写SQL语句时很方便,而在执行SQL语句环节就显得不太优雅;另外我们也介绍了使用映射器完成对数…...
微服务引擎
微服务引擎,MSE_微服务引擎 MSE-阿里云帮助中心 一、什么是微服务引擎MSE 微服务引擎MSE(Microservices Engine)是一个面向业界主流开源微服务生态的一站式微服务平台,提供注册配置中心(原生支持Nacos/ZooKeeper/Eur…...

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS基础(三)
允许一切发生,生活不过是见招拆招。 思维导图 一、循环-for 1.1 for 循环-基本使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEe…...
搭建部署属于自己的基于gpt3.5的大语言模型(基于flask+html+css+js+mysql实现)
一、简介 本项目是一个基于GPT-3.5模型的聊天机器人网站,旨在为用户提供一个简便、直接的方式来体验和利用GPT-3.5模型的强大功能。项目以Flask为基础,构建了一个完整的Web应用程序,其中包含了多个前端页面和后端API接口,能够处理…...

AI创作专家,免费的AI创作专家工具
AI创作专家是一种崭新的工具,它们利用先进的人工智能技术,帮助创作者和写手更轻松地应对创作挑战。这些工具不仅可以生成文字,还可以提供灵感、帮助构思和组织思路,使创作过程更加高效。 147GPT批量文章生成工具www.147seo.com/…...

Nginx之gzip模块解读
目录 gzip基本介绍 gzip工作原理 Nginx中的gzip 不建议开启Nginx中的gzip场景 gzip基本介绍 gzip是GNUzip的缩写,最早用于UNIX系统的文件压缩。HTTP协议上的gzip编码是一种用来改进web应用程序性能的技术,web服务器和客户端(浏览器&…...

微软在Windows 11推出Copilot,将DALL-E 3集成在Bing!
美东时间9月21日,微软在美国纽约曼哈顿举办产品发布会,生成式AI成为重要主题之一。 微软表示,Copilot将于9月26日在Windows 11中推出;Microsoft 365 Copilot 将于11 月1日向企业客户全面推出;将OpenAI最新的文本生成图…...

SLAM从入门到精通(消息传递)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们只是编写了一个publisher节点,以及一个subscribe节点。有了这两个节点,它们之间就可以通信了。在实际生产中&#…...

思科路由器:NAT的基础配置
一直以来,对于华为、H3C、锐捷交换机的命令配置,不断的有朋友留言,三家交换机的配置命令容易弄混,经常在实际项目配置中出错,因此,找几个基础的示例来练练。 R1配置 Router>en Router>enable Rout…...
动态代理。
无侵入式的给代码增加额外的功能 代理的作用:对象如果干的事情太繁琐,就可以通过代理来转移部分职责;也就是相当于把对象的的方法拆开一些步骤分给代理做,对象做关键的就行了;并且代理做的这些繁琐的事情的名字也要和…...

Learn Prompt-GPT-4:能力
GPT-4能力大赏 常识知识推理 一个猎人向南走了一英里,向东走了一英里,向北走了一英里,最后回到了起点。他看到了一只熊,于是开枪打了它。这只熊是什么颜色的? 答案是白色,因为这种情况只可能发生在北…...

iOS——ViewController的生命周期
ViewController ViewController的生命周期是指在应用程序运行过程中,ViewController实例从创建到销毁的整个过程。在这个过程中,ViewController会经历一系列的生命周期方法,这些方法可以帮助开发者管理ViewController及其相关的视图和逻辑。…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...