2014-10-07 65 views
38

我发现pip在编译包时只使用单核。由于一些python包需要一些时间来使用pip来构建,所以我想在机器上使用多核。在使用Makefile时,我可以这样做,就像下面的命令:使用多核的PIP构建选项

make -j4 

我该如何为pip实现相同的功能?

+0

[Parallel Pip install](http:// stackoverflow.com/questions/11021130/parallel-pip-install) – 2014-10-07 07:02:28

+3

我不认为这是重复的问题。在“并行点安装”线程中,如果我理解正确,作者想要运行多个点安装过程。相比之下,我想要做的是使用多个核心安装一个软件包。 – Jihun 2014-10-07 07:10:33

+1

据我所知,这是不实施。必须定制命令build_ext来实现此目的。 – marscher 2014-10-23 18:47:26

回答

2

从我可以告诉它看起来不像pip有这种能力,但我可能会误解。

要做到在Python中使用多包多,[这里是一个导游,我发现]关于如何做到这一点,如果你有兴趣(http://pymotw.com/2/multiprocessing/basics.html),这是一个link于谈论它的Python文档。我也发现这个问题很有用,Multiprocessing vs Threading Python,以确保多处理做到了我认为的那样,利用了多个CPU。

我已经通过pip源代码(可用here)寻找多处理包的参考,并没有发现任何包的使用。这意味着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 documentation,发现没有提及使用多核心进行安装。

TL; DR:Pip不会做你在问什么。我可能是错的,因为我没有长时间看源代码,但我确信它不支持它。

+0

这是一个虽然我对pip不支持此功能有点失望,但是非常感谢您的分析。 – Jihun 2014-10-30 02:41:10

+1

此答案已过时。请参阅下面的Plasmatium的答案。 – 2016-08-23 19:51:20

24

终极的方式来解决这一问题

因为所有的C/CPP文件将使用make称道进行编译,并make具有指定多少CPU内核shoule被用来编译源的选择代码,我们可以在make上做一些技巧。

  1. 备份你原来make命令:

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

  2. 写了一个 “假” make命令,该命令将追加--jobs=6它的参数列表,并将它们传递给原来的make命令make.bak

    make.bak --jobs=6 [email protected]

所以之后,甚至没有用c库编译python,而且其他包含c库的编译器也会加速编译6个内核。其实所有使用make命令编译的文件都会加快速度。

祝你好运。


用途:--install选项= “ - 工作= 6”

pip3 install --install-option="--jobs=6" PyXXX 

我有同样的需求,使用pip安装来加快编译进度。我的目标包是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分钟。

-------------------------- update ------------------- -----------

如下面的评论,我终于用招数是这样的: cd /usr/bin sudo mv make make.bak touch make 然后编辑制作:vim make或其他方式,你喜欢和输入: make.bak --jobs=6 $* 我不熟悉bash,所以我不确定这是否是正确的bash代码。我正在用windows写这篇评论。关键是重命名make make.bak,然后创建一个新的make,使用这个新make使用添加的参数调用make.bak --jobs = 6

+0

似乎可行 - 当我以这种方式运行它时,所有内核上的处理器负载都会增加。 – BenB 2016-02-09 20:11:13

+0

我收到警告'UserWarning:由于使用了--build-options/--global-options/--install-options,禁用所有轮子的使用。这很有道理,但使用多核的性能优势可能超过不使用车轮的性能优势吗?它依赖于什么? – max 2016-09-21 22:56:56

+0

pip(不是pip3)怎么样? 我得到:'错误:选项 - 工作不认可' – timotheecour 2016-09-23 20:13:56