【问题标题】:Why does it take 5 seconds to import numpy in fresh virtualenv?为什么在新的 virtualenv 中导入 numpy 需要 5 秒?
【发布时间】:2021-10-14 22:10:27
【问题描述】:

背景

你好。我们编写在我们无法控制的服务器上运行的 Python 代码。我们对代码运行的环境了解不多。如果运行时间超过 3 秒,我们的代码就会被拒绝。所以我决定开始使用虚拟环境对我们的代码进行计时,以给出最坏情况下的运行时估计。

问题

我惊讶地发现,在一个全新的虚拟环境中,只需 5 秒就可以导入 numpy.有人可以解释为什么会这样吗?有什么技巧可以加快速度吗?一个基本库这么慢似乎令人望而却步。

重现步骤:

  1. rm -r /tmp/env
  2. virtualenv /tmp/env
  3. /tmp/env/bin/pip install numpy
  4. time /tmp/env/bin/python3 -c 'import numpy'

在我的高端笔记本电脑上它返回

  real  0m5.534s
  user  0m0.612s
  sys   0m0.133s

请注意,由于我不清楚的原因,如果您重复第 4 步而不返回第 1 步,则时间会明显减少。即使您首先运行find /tmp -type d -name '__pycache__' -exec rm -r {} \;,这种情况仍然存在。它一定是我不知道的其他类型的模块缓存吗?反正对我来说没关系,因为我无法控制远程服务器的缓存状态。

【问题讨论】:

  • "basic library" 没有什么关于 numpy 的“基本”,是一个非常大的库,整个文件夹是 55mb
  • 嗯...我无法在我的机器上重现缓慢,而且速度相对较慢。但我使用了venv 而不是virtualenv - 不确定这是否会有所不同。你使用的是什么版本的 Python?我正在使用 3.9.7。
  • @wjandrea,感谢您尝试复制。我正在使用 python 3.7.3。我尝试用 python3 -m venv /tmp/env 替换步骤 2 来尝试 venv,但没有发现差异。

标签: python numpy virtualenv


【解决方案1】:

因为 numpy 太大了,第一次导入需要很长时间,不仅将所有这些文件加载​​,而且将 "compiling" 全部加载到 .pyc 中,一旦完成,未来的导入会更快。这就是为什么当你重新开始时,与你只做第 4 步而不回到第 1 步时相比需要很长时间的原因

至于加快速度的技巧,我认为查看pip install -h --compile 选项应该可以解决问题...

【讨论】:

  • 好主意,但我尝试了您的修复,但没有任何区别。我在第 3 步中添加了 --compile 选项,并继续获得相同的运行时间。
  • 我在我的机器上也注意到每天第一次导入numpy的那天很慢,但是下一次就不是了,可能需要加个步骤3.5先导入,为了让下一个更快,或者尝试使用一些调用 python 的标志,查看 python -h 尝试使用 -B--check-hash-based-pycs never
  • 感谢您的建议。我继续尝试了-B--check-hash-based-pycs never 选项,但无法改变行为。
  • 然后我的想法用完了,也许你需要找到一些更轻的库来代替,快速搜索会产生这个tinynumpy 和这个shrink numpy 或者尝试直接在 numpy 的存储库中询问和/或深入其文档以查看其中是否有某种方法...希望其中任何一种有用...
  • 谢谢,我很欣赏这些想法和链接!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多