请问: Python 能否预加载一些模块 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ZXYF
V2EX    Python

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

  •  
  •   ZXYF 2022-04-12 14:33:51 +08:00 3097 次点击
    这是一个创建于 1353 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    我写某个 pyqt5 加载很多东西,一个“小”项目用了几十个三方包
    我已经扔在一个文件里面集中加载了,后续的从这个文件 import 基本不耗时,就是打开时等待时间确实有点“焦虑”(约 30 秒,含一些预置的环境数据计算)
    后来我加了一个 splash screen ,初始化窗口,并放了一个进度条,能看到%增长就没有那么大的焦虑感了
    ipwx
        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
    LeeReamond
        10
    LeeReamond  
       2022-04-13 09:26:12 +08:00
    很有趣,不想使用 ironpython 的话,倒也不是完全蛋疼的需求。

    楼上两位提到两种解决方案,一种是通过 web 加载 import 包所需数据,不过我好奇这种方式加载的数据如何被 sys.modules 引用以实现正常 import 的效果。
    另一种是创建进程然后动态 fork 的方案,比较好奇 fork 之后的子进程如何执行自定义内容的脚本,难道要靠 eval 或者某些对字节码的 hacking ?
    julyclyde
        11
    julyclyde  
       2022-04-13 14:46:21 +08:00
    site.py 功能呗
    ZXYF
        12
    ZXYF  
    OP
       2022-04-13 15:31:32 +08:00
    @julyclyde 我看了一下,好像这个文件只是负责 sys.path ?并没有加载模块,只是提供了路径?
    julyclyde
        13
    julyclyde  
       2022-04-13 16:06:50 +08:00
    @ZXYF 我觉得你在里边其实做啥都行吧,那就是个标准 py 脚本
    crazycabbage
        14
    crazycabbage  
       2022-04-14 15:56:05 +08:00
    可以参考一下这个项目: https://github.com/8080labs/pyforest
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5234 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 03:34 PVG 11:34 LAX 19:34 JFK 22:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86