使用多核的 Pip 构建选项

问题描述 投票:0回答:4

我发现pip在编译包时只使用单核。由于使用 pip 构建某些 python 包需要一些时间,因此我想在机器上使用多核。当使用 Makefile 时,我可以像下面的命令一样做到这一点:

make -j4

我怎样才能为 pip 实现同样的目标?

python installation pip
4个回答
51
投票

解决此问题的终极方法

因为所有的c / cpp文件都会使用

make
命令来编译,并且
make
有一个选项指定应该使用多少个CPU核心来编译源代码,所以我们可以在
make
上做一些技巧。

  1. 备份原来的

    make
    命令:

    sudo cp /usr/bin/make /usr/bin/make.bak

  2. 编写一个“假”

    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


37
投票

测试了这个作品 https://stackoverflow.com/a/57014278/6147756

单个命令:

MAKEFLAGS="-j$(nproc)" pip install xxx

对脚本中的所有命令启用:

export MAKEFLAGS="-j$(nproc)"

8
投票

据我所知,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 没有按照你的要求做。我可能是错的,因为我没有看源码那么久,但我很确定它只是不支持它。


0
投票

在某些共享托管环境中,构建核心受到限制,因此

pip install uwsgi
无法从源构建包。在 uWSGI 的特定情况下,可以使用特定于 uWSGI 构建系统的
CPUCOUNT
env 变量来限制/设置核心:

CPUCOUNT=1 pip install uwsgi
© www.soinside.com 2019 - 2024. All rights reserved.