请问: Python 能否预加载一些模块

2022-04-12 14:33:51 +08:00
 ZXYF

运行代码时发现,import 导入一些大包时耗费了大量的时间, 经查资料发现,python 解释器在启动时会预加载一些内置模块到内存上,比如__builtins__里面的模块,当 python 调用__builtins__里面的模块时,会直接从内存上取,大大缩短时间 于是就想,能不能把类似 numpy 之类的模块也像内置模块一样,在 python 启动时就加载到内存上,当 import numpy 时,直接从内存上取,用空间换时间?

2590 次点击
所在节点    Python
14 条回复
hsfzxjy
2022-04-12 14:49:10 +08:00
这不就是把加载 numpy 的时间从执行脚本的时候移到解释器启动的时候,都是一次性加载有什么不一样吗?
est
2022-04-12 14:54:04 +08:00
1. 新建一个 main.py 文件
2. 把需要的 import 都写在这个文件里,写满 5 个屏幕
3. ???
4. 从 main.py 启动代码!
ZXYF
2022-04-12 14:57:17 +08:00
@hsfzxjy 对,就是想其他文件调用 numpy 的时候不从硬盘上取,直接从内存上取,类似于环境变量?解释器启动时加载到内存,并放到 sys.modules 字典里面,每次执行其他 python 文件的时候,就节省了时间
raycool
2022-04-12 15:05:29 +08:00
直接使用 jupyter 不行吗?
ila
2022-04-12 15:06:51 +08:00
做成服务,用 http 或 websocket 提交需要处理的数据?
ZXYF
2022-04-12 15:09:24 +08:00
@ila 对,我目前找到的办法就是这个
ClericPy
2022-04-12 15:17:10 +08:00
导入模块还真没遇到特别久的... 导入模型倒是遇到好几次, 从磁盘往内存导入的过程就占用很长时间了, 似乎有一些办法把模型驻留在内存里解决这个 IO 过程太长的问题

话说如果内存够大, 平时就用 interactive 模式不就够了, 没必要每次都冷启动.
imn1
2022-04-12 15:18:37 +08:00
不建议扔进 builtins ,我以前试过把一些东西扔进去,产生“意想不到”的错误,较难排查

我写某个 pyqt5 加载很多东西,一个“小”项目用了几十个三方包
我已经扔在一个文件里面集中加载了,后续的从这个文件 import 基本不耗时,就是打开时等待时间确实有点“焦虑”(约 30 秒,含一些预置的环境数据计算)
后来我加了一个 splash screen ,初始化窗口,并放了一个进度条,能看到%增长就没有那么大的焦虑感了
ipwx
2022-04-12 15:25:58 +08:00
1 、做一个启动器,监听端口做服务。
2 、收到要启动进程的请求,fork & exec 。
3 、传回结果。

……

然后你发现,你实现了一个 rq 。所以干脆直接用 rq 。顺便你说的这个问题在这一页 doc 上有写:

https://python-rq.org/docs/workers/#performance-notes
LeeReamond
2022-04-13 09:26:12 +08:00
很有趣,不想使用 ironpython 的话,倒也不是完全蛋疼的需求。

楼上两位提到两种解决方案,一种是通过 web 加载 import 包所需数据,不过我好奇这种方式加载的数据如何被 sys.modules 引用以实现正常 import 的效果。
另一种是创建进程然后动态 fork 的方案,比较好奇 fork 之后的子进程如何执行自定义内容的脚本,难道要靠 eval 或者某些对字节码的 hacking ?
julyclyde
2022-04-13 14:46:21 +08:00
site.py 功能呗
ZXYF
2022-04-13 15:31:32 +08:00
@julyclyde 我看了一下,好像这个文件只是负责 sys.path ?并没有加载模块,只是提供了路径?
julyclyde
2022-04-13 16:06:50 +08:00
@ZXYF 我觉得你在里边其实做啥都行吧,那就是个标准 py 脚本
crazycabbage
2022-04-14 15:56:05 +08:00
可以参考一下这个项目: https://github.com/8080labs/pyforest

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/846522

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX