【问题标题】:Takes an "eternity" to run my Python script [closed]需要“永恒”来运行我的 Python 脚本 [关闭]
【发布时间】:2013-08-28 18:13:36
【问题描述】:

我有一个 Python 脚本,它从任何目标文件加载二进制数据并存储在里面 本身,在一个列表中。问题是存储的文件越大,下次打开它所需的时间就越长。假设我想加载一个 700 MB 的电影并将其存储在我的脚本文件中。然后想象我第二天打开它,其中存储在该脚本中的 700 MB 数据。打开它需要很长时间!

这是脚本文件外观的简化布局。

第 1 行:“700 MB 的电影存储在列表中。”

以下所有内容:“最终用户使用的所有功能。”

在解释器到达用户等待调用的函数之前, 它必须首先解释第 1 行的 700 MB 数据!这是个问题 因为谁愿意为了打开一个脚本而等待一个小时?

那么,如果我像这样更改文件的布局会有帮助吗?

第一行:“最终用户使用的所有功能。”下图:“700 MB 电影存储在一个列表中。”

这会有帮助吗?或者解释器是否必须在调用函数之前遍历所有 700 MB?

【问题讨论】:

  • 究竟如何以及为什么在 Python 中存储一个 700Mb 的文件?
  • 为什么你的脚本会自己添加数据?
  • 同时,显而易见的解决方案是将数据放在一个单独的文件中,并在启动时读取和处理它。如果处理时间过长,只需pickle 并存储结果,如果它与原始数据文件是最新的,则使用 pickle 文件。
  • @dzhioev 提出了一个很好的观点。更重要的是,你能描述一下你试图通过这样做来解决的实际用例吗?因为这闻起来很像XY problem
  • @Bakuriu:嗯,它在 80 年代初的 8 位家用电脑上通常非常有用,并且在 90 年代它仍然与复制保护相关,我认为对于那些写病毒。编写一个在第一次运行时将自身修改为 quine 的程序总是一个有趣的测试……

标签: python


【解决方案1】:

Python 编译器的工作方式让你想要做的事情至少很难说。

首先,每次更改脚本时(例如通过添加文件),它都会在执行之前触发新的编译循环(将 .py 文件转换为 .pyc 文件)。

其次,每次导入模块时,都会将大块数据加载到内存中(无论是在导入时还是在您第一次访问数据时)。

这不仅速度慢,而且不安全且容易出错。

我猜你打算做的是,分发一个包含数据的文件。

你也许可以用这个小技巧做到这一点:

制作executable python package(基本上是一个 zip 文件)。 使用 zipfile 模块构建 zip 文件非常简单。

【讨论】:

    猜你喜欢
    • 2015-02-17
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多