【问题标题】:How to cache imported modules once off for multiple runs of a python script?python - 如何为多次运行python脚本一次缓存导入的模块?
【发布时间】:2019-09-03 07:55:42
【问题描述】:

我有一个 python 脚本,我想使用 cron 作业每 1 分钟定期运行一次。该脚本每次运行时都会导入一些 python 模块和配置文件。问题是,所有导入都有一些很大的开销(1-2 分钟)。 (模块和文件都比较小,总大小只有 15 MB,可以轻松放入内存中)。

导入所有内容后,脚本的其余部分运行速度相对较快(大约 0.003 秒;计算要求不高)。

是否可以在脚本第一次运行时缓存所有导入,以便脚本运行的所有后续时间都不需要再次导入模块和文件?

【问题讨论】:

    标签: python-3.x caching import python-import


    【解决方案1】:

    不,你不能。您将不得不使用持久性存储,例如shelve,或内存中的某些东西,例如SQLite,您可以在其中存储任何在会话之间持续存在的昂贵计算,然后您只需从内存/磁盘中读取这些结果,具体取决于您选择的存储空间。

    此外,请注意modules are, in fact, being cached upon import 以改善加载时间,但是,不是在内存中,而是在磁盘上,因为.pyc 文件在__pychache__ 下,并且导入时间本身通常是微不足道的,所以你的导入需要这么长时间不是因为导入本身,而是因为这些模块内部的计算,所以您可能需要优化这些。

    你不能做你想做的事的原因是为了将数据保存在内存中,进程必须保持运行。内存属于运行脚本的进程,一旦脚本完成,内存就会被释放See here 了解有关您的问题的更多详细信息。

    您不能只运行一个脚本并用您拥有的任何计算填充内存,直到您可以再次运行它,因为首先,内存不知道另一个时间是什么时候(可能是 1 分钟)稍后,可能是 1 年后)其次,如果你能够做到这一点,那么想象一下当操作系统中不同应用程序的不同脚本(不仅仅是你的程序在那里)时,你会在多长时间内耗尽内存将用他们的计算结果填充内存。

    因此,您可以在无限循环中运行您的代码并休眠(并保持进程处于活动状态),或者您可以使用 crontab 并将之前的结果存储在某处。

    【讨论】:

    • 感谢@George 的回答,您说的很有道理。 p.s. “光年”是距离单位,不是时间:)
    猜你喜欢
    • 2012-06-24
    • 2011-06-09
    • 2020-07-19
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多