Pip构建选项以使用多核

Jih*_*hun 44 python install pip

我发现pip在编译包时只使用单核.由于一些python包需要一些时间来构建使用pip,我想在机器上使用多核.使用Makefile时,我可以像下面这样执行命令:

make -j4
Run Code Online (Sandbox Code Playgroud)

我怎么能为pip做同样的事情?

小智 36

测试了这个作品 /sf/answers/3990999491/

单个命令:

MAKEFLAGS="-j$(nproc)" pip install xxx
Run Code Online (Sandbox Code Playgroud)

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

export MAKEFLAGS="-j$(nproc)"
Run Code Online (Sandbox Code Playgroud)

  • 嗨,玉树。请链接到您所引用的答案而不是问题。您可以点击答案下方的“分享”以获得直接链接。 (2认同)

Pla*_*ium 30

解决这个问题的最终方法

因为所有的c/cpp文件都是使用makecommend 编译的,并且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 libs编译python,而且其他包含c libs的人将加速编译6个核心.实际上,使用make命令编译的所有文件都会加速.

还有祝你好运.


使用: - install-option =" - jobs = 6".

pip3 install --install-option="--jobs=6" PyXXX
Run Code Online (Sandbox Code Playgroud)

我有同样的要求,使用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并添加param --jobs = 6

  • 看来传递给`--install-option`的参数只是转发到你正在安装的软件包的`setup.py`.因此,`--jobs = 6`**特定于PySide的构建过程**.其他包可能具有相似(或相同)的构建标志,但它不是通用选项. (13认同)
  • 我收到警告`UserWarning: Disabling all use of wheel due to the use of --build-options / --global-options / --install-options.`。这是有道理的,但使用多核的性能优势是否可能超过不使用轮子的性能损失?它取决于什么? (3认同)
  • pip(不是pip3)怎么样?我得到:`错误:选项 --jobs 无法识别` (2认同)

gur*_*e94 6

据我所知,pip 似乎没有这种能力,但我可能会误会。

要在 python 中进行多处理,您可以使用多处理包,[这是我找到的指南](http://pymotw.com/2/multiprocessing/basics.html)关于如何做,如果您有兴趣,这是一个链接到谈论它的 python 文档。我还发现这个问题很有用,Multiprocessing vs Threading Python,以确保多处理做了我认为它所做的,利用了多个 CPU。

我已经浏览了 pip 源代码(可在此处获得)以寻找对 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
Run Code Online (Sandbox Code Playgroud)

您可以看到其中没有对多处理包的任何引用,但我确实检查了所有其他文件,只是为了确定。

此外,我检查了pip install 文档,没有发现使用多核安装的参考。

TL;DR:Pip 没有按照你的要求去做。我可能是错的,因为我没有看那么久的来源,但我很确定它只是不支持它。

  • 这个答案已经过时了。请参阅下面 Plasmatium 的回答。 (3认同)