【问题标题】:Python 3 in Yocto very slow on Raspberry PiYocto 中的 Python 3 在 Raspberry Pi 上非常慢
【发布时间】:2017-08-31 02:58:01
【问题描述】:

我们已将 Python 2 用于我们目前在 Raspberry Pi 上进行原型设计的嵌入式应用程序。这有点慢,但可以接受。

现在我们已将应用程序移植到 Python 3。但由于某种原因,应用程序的运行速度比 Python 2 慢 4 倍!我原以为 Python 3 会慢一点,但没有这样的!

我们的 Linux 发行版基于 Yocto 2.2 Morty,我们使用默认的 Python 3.5.2 配方,没有进行任何自定义。我们还使用 meta-raspberrypi 层来实现 Raspberry 兼容性。

我尝试对“pip3 --help”进行计时,结果如下:

$ time pip3 --help >/dev/null

real    0m22.686s
user    0m22.210s
sys     0m0.420s

然后我使用最新的 Raspbian 发行版在相同的硬件(同样的 sd 卡)上尝试了相同的测试:

$ time pip3 --help >/dev/null

real    0m6.874s
user    0m6.530s
sys     0m0.310s

$ time pip --help >/dev/null

real    0m4.329s
user    0m4.000s
sys     0m0.300s

Python 2 pip 比 Python 3 快一点,但最重要的是 pip3 在 Raspbian 上的运行速度比在 Yocto 上快 3 倍以上!

测试是非常可重复的,所以它们不是由 pyc 生成或缓存或类似的东西引起的。

任何想法如何让 Yocto 和 Raspbian 一样快?

更新:

下面在 Raspbian vs Yocto 中有一些关于 Python 和 Pip 不同版本的讨论,所以我只使用 Python 标准库做了一个新的基准测试:

Yocto 2.2 莫蒂:

sh-4.3# time python3 --version
Python 3.5.2

real    0m0.024s
user    0m0.010s
sys     0m0.000s
sh-4.3# time python3 -c "import asyncio"

real    0m3.439s
user    0m3.300s
sys     0m0.110s

Raspbian:

pi@raspberrypi:~$ time python3 --version
Python 3.4.2

real    0m0.020s
user    0m0.000s
sys     0m0.010s
pi@raspberrypi:~$ time python3 -c "import asyncio"

real    0m2.023s
user    0m1.850s
sys     0m0.160s

然后我在 Raspbian 上下载了 Python 3.5.2 并从源代码构建它,没有自定义配置 (./configure; make; make install)。使用 Python 3.5.2 我得到以下结果:

pi@raspberrypi:~$ time python3.5 --version
Python 3.5.2

real    0m0.018s
user    0m0.000s
sys     0m0.010s
pi@raspberrypi:~$ time python3.5 -c "import asyncio"

real    0m2.689s
user    0m2.610s
sys     0m0.070s

因此,Python 3.5 似乎比 3.4 慢得多,但在默认的 Yocto 构建上仍然比在默认构建配置的 Raspbian 上慢得多。

更新 2:

我在 Yocto 系统上以相同的方式构建了 Python 3.5.2(“./configure; make; make install”),与标准 Python 配方相比,得到了大约 20% 的改进:

root@la:/var/src/Python-3.5.2# time python3.5 -c "import asyncio"

real    0m2.914s
user    0m2.750s
sys     0m0.130s

【问题讨论】:

  • 你能指定python(s)、pip(s)和yocto的版本吗?你提到了 yocto 2.0 和 python 3.5.2 但这些版本不匹配......
  • 作为参考,我在 qemu 中的 yocto 构建中尝试了 pip 和 pip3:它们的速度差不多,但启动起来确实很慢——大约 10 秒打印版本字符串。
  • @jku 你是对的,我是从我的脑海中挑选出来的,显然有错误的 yocto 版本。这是 Yocto 2.2 莫蒂。 pip3 版本是 8.1.2。 Python 是 3.5.2 版。
  • 另外,我应该注意到我没有在这个 Yocto 版本上使用 Python 2 进行测试。上一次我们用 Python 2 编写的应用程序构建发行版是接近一年前,所以这就是我要比较的。不幸的是,我什至没有安装 pip2,但如果有帮助的话,我可以在下一个版本中添加它以进行比较。
  • raspbian python3 和 pip3 版本是否与您的 yocto 版本相似?如果是,那么可能值得在 bugzilla.yoctoproject.org 上提交一个错误

标签: python python-3.x raspberry-pi raspbian yocto


【解决方案1】:

Yocto Python 2 在optimized mode 中编译。尝试使用 ./configure --enable-optimizations 配置 Python 3(我认为是 3.5.3+),正如 here 所讨论的那样。

【讨论】:

  • Yocto 2.0 中的 Python3 仍然有您引用的优化补丁(默认情况下设置 Py_OptimizeFlag=1)。该补丁后来被删除,因为它并没有真正优化任何东西——据我所知,它所做的唯一有意义的事情是禁用断言。我有兴趣找出问题所在,但我认为这与此无关......
  • 后来的评论证实这是在 yocto 2.2 上,我认为它不再有优化补丁——所以我上面的评论是无效的(我的观点是,但 python 可能真的在“不是优化”模式)。
猜你喜欢
  • 1970-01-01
  • 2015-10-25
  • 2017-11-28
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多