运行代码时发现,import 导入一些大包时耗费了大量的时间, 经查资料发现,python 解释器在启动时会预加载一些内置模块到内存上,比如__builtins__里面的模块,当 python 调用__builtins__里面的模块时,会直接从内存上取,大大缩短时间 于是就想,能不能把类似 numpy 之类的模块也像内置模块一样,在 python 启动时就加载到内存上,当 import numpy 时,直接从内存上取,用空间换时间?
1
hsfzxjy 2022-04-12 14:49:10 +08:00 via Android
这不就是把加载 numpy 的时间从执行脚本的时候移到解释器启动的时候,都是一次性加载有什么不一样吗?
|
2
est 2022-04-12 14:54:04 +08:00
|
3
ZXYF OP @hsfzxjy 对,就是想其他文件调用 numpy 的时候不从硬盘上取,直接从内存上取,类似于环境变量?解释器启动时加载到内存,并放到 sys.modules 字典里面,每次执行其他 python 文件的时候,就节省了时间
|
4
raycool 2022-04-12 15:05:29 +08:00
直接使用 jupyter 不行吗?
|
5
ila 2022-04-12 15:06:51 +08:00 via Android
做成服务,用 http 或 websocket 提交需要处理的数据?
|
7
ClericPy 2022-04-12 15:17:10 +08:00
导入模块还真没遇到特别久的... 导入模型倒是遇到好几次, 从磁盘往内存导入的过程就占用很长时间了, 似乎有一些办法把模型驻留在内存里解决这个 IO 过程太长的问题
话说如果内存够大, 平时就用 interactive 模式不就够了, 没必要每次都冷启动. |
8
imn1 2022-04-12 15:18:37 +08:00
不建议扔进 builtins ,我以前试过把一些东西扔进去,产生“意想不到”的错误,较难排查
我写某个 pyqt5 加载很多东西,一个“小”项目用了几十个三方包 我已经扔在一个文件里面集中加载了,后续的从这个文件 import 基本不耗时,就是打开时等待时间确实有点“焦虑”(约 30 秒,含一些预置的环境数据计算) 后来我加了一个 splash screen ,初始化窗口,并放了一个进度条,能看到%增长就没有那么大的焦虑感了 |
9
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 |
10
LeeReamond 2022-04-13 09:26:12 +08:00
很有趣,不想使用 ironpython 的话,倒也不是完全蛋疼的需求。
楼上两位提到两种解决方案,一种是通过 web 加载 import 包所需数据,不过我好奇这种方式加载的数据如何被 sys.modules 引用以实现正常 import 的效果。 另一种是创建进程然后动态 fork 的方案,比较好奇 fork 之后的子进程如何执行自定义内容的脚本,难道要靠 eval 或者某些对字节码的 hacking ? |
14
crazycabbage 2022-04-14 15:56:05 +08:00
可以参考一下这个项目: https://github.com/8080labs/pyforest
|