荥阳市城乡建设规划网站,如何做网站推广的策略,如何网页设计与制作,工商局注册公司网站问题放到前面#xff0c;目前发现一个问题#xff0c;importlib对于c/c编译过来的包#xff0c;只支持导入最顶层的包#xff0c;不过也够了。 因为有些项目的依赖太多#xff0c;所以导致每个文件头部都包含大量import语句#xff0c;用来导入必要的包#xff0c;如果量… 问题放到前面目前发现一个问题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(waitTrue)在所有线程都执行完毕前阻塞当前线程res executor.map(my_import,module_list)
首先import_module函数必须有个变量接收导入的模块名但是多线程导入没有变量接收导入的模块名导致虽然导入了但是没法用所以必须有变量去接受最直接的办法就是放到list或者字典但是这样用的时候不如原生导入那样方便用list每次必须带索引用字典每次都要用字典那种key的形式我觉得都不够简洁我最期望的效果还是跟原来一样导入完直接就是一个变量用的时候直接用那么其实就是需要一种能动态生成变量的技术而且生成的是普通变量而不是listdict这种并且还要暴露在本地名字空间里就是说我可以直接用怎么做呢经过搜索发现python确实有解决方案那就是locals()或者globals()它可以把一个字符串直接变成变量有了这个方法批量导入就彻底完活了既可以借助多线程多进程批量导入也可以按照原来的方式直接用对程序的带动很小简直完美。