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 · 2356 次点击
    这是一个创建于 737 天前的主题,其中的信息可能已经有所发展或是发生改变。

    运行代码时发现,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
    @hsfzxjy 对,就是想其他文件调用 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   ·   我们的愿景   ·   实用小工具   ·   3819 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 04:14 · PVG 12:14 · LAX 21:14 · JFK 00:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.