我发现pip在编译包时只使用单核。由于使用 pip 构建某些 python 包需要一些时间,因此我想在机器上使用多核。当使用 Makefile 时,我可以像下面的命令一样做到这一点:
make -j4
我怎样才能为 pip 实现同样的目标?
解决此问题的终极方法
因为所有的c / cpp文件都会使用
make
命令来编译,并且make
有一个选项指定应该使用多少个CPU核心来编译源代码,所以我们可以在make
上做一些技巧。
备份原来的
make
命令:
sudo cp /usr/bin/make /usr/bin/make.bak
编写一个“假”
make
命令,该命令会将--jobs=6
附加到其参数列表中,并将它们传递给原始make命令make.bak
:
make.bak --jobs=6 $@
所以之后,即使不使用c lib编译python,但其他包含c lib的编译速度也会加快6个核心的编译速度。实际上,使用
make
命令编译的所有文件都会加速。
祝你好运。
使用:--install-option="--jobs=6"(pip 文档)。
pip3 install --install-option="--jobs=6" PyXXX
我有同样的需求,使用 pip install 来加快编译进度。我的目标 pkg 是 PySide。一开始我使用
pip3 install pyside
,花了我近30分钟(AMD 1055T 6核,10G RAM),只有一个核心负载100%。
pip3 --help
中没有任何线索,但我发现了很多类似pip install -u pyXXX
的选项,但我不知道'-u'是什么,而且这个参数也没有在pip --help
中。我尝试了“pip3 install --help”,得到了答案:--install-option。
我阅读了PySide的代码,发现了另一个线索:
OPTION_JOBS = has_option('jobs')
,我把ipdb.set_trace()放在那里,终于明白如何使用多核通过使用pip install进行编译。
我花了大约6分钟。
--------------------------------------更新---------------------- --------
正如下面的评论,我最终使用了这样的技巧:
cd /usr/bin
sudo mv make make.bak
touch make
然后编辑 make: vim make
或您喜欢的其他方式并输入:
make.bak --jobs=6 $*
我不熟悉 bash,所以我不确定这是否是正确的 bash 代码。我是在 Windows 中写这条评论的。关键是把make重命名为make.bak,然后创建一个新的make,用这个新的make调用make.bak并添加参数--jobs=6
测试了这个作品 https://stackoverflow.com/a/57014278/6147756
单个命令:
MAKEFLAGS="-j$(nproc)" pip install xxx
对脚本中的所有命令启用:
export MAKEFLAGS="-j$(nproc)"
据我所知,pip 似乎没有这种能力,但我可能是错的。
要在Python中进行多重处理,您可以使用多重处理包,[这是我找到的指南](http://pymotw.com/2/multiprocessing/basics.html)如果您有兴趣,可以了解如何执行此操作是谈论它的 python 文档的link。我还发现这个问题很有用,Multiprocessing vs Threading Python,以确保多处理按照我的想法进行,即利用多个 CPU。
我已经浏览了 pip 源代码(可在 here 获取)寻找对 multiprocessing 包的引用,但没有找到该包的任何用途。这意味着 pip 不使用/支持多处理。据我所知,
/pip/commands/install.py
文件是您的问题感兴趣的文件,因为当您运行 pip install <package>
时会调用它。对于这个文件,具体的导入是
from __future__ import absolute_import
import logging
import os
import tempfile
import shutil
import warnings
from pip.req import InstallRequirement, RequirementSet, parse_requirements
from pip.locations import virtualenv_no_global, distutils_scheme
from pip.basecommand import Command
from pip.index import PackageFinder
from pip.exceptions import (
InstallationError, CommandError, PreviousBuildDirError,
)
from pip import cmdoptions
from pip.utils.deprecation import RemovedInPip7Warning, RemovedInPip8Warning
您可以看到它没有任何对多处理包的引用,但我确实检查了所有其他文件以确保确定。
此外,我检查了 pip install 文档,没有找到使用多核安装的参考。
TL;DR:Pip 没有按照你的要求做。我可能是错的,因为我没有看源码那么久,但我很确定它只是不支持它。
在某些共享托管环境中,构建核心受到限制,因此
pip install uwsgi
无法从源构建包。在 uWSGI 的特定情况下,可以使用特定于 uWSGI 构建系统的 CPUCOUNT
env 变量来限制/设置核心:
CPUCOUNT=1 pip install uwsgi