Pip构建选项以使用多核
我发现,编译包时,pip只使用单核。 由于一些python包需要一些时间来使用pip来构建,所以我想在机器上使用多核。 当使用Makefile时,我可以像下面的命令那样做:
make -j4
我怎样才能达到同样的东西的点子?
从我可以告诉它看起来不像pip有这种能力,但我可能会误解。
要在python中执行多处理,你可以使用多处理包,[这里是我找到的指南](http://pymotw.com/2/multiprocessing/basics.html),如果你感兴趣的话,如何做到这一点,这是一个链接到讨论它的python文档。 我还发现这个问题很有用,Multiprocessing vs Threading Python,以确保多处理做到了我认为的那样,利用了多个CPU。
我已经通过pip源代码(在这里可以找到)寻找多处理包的参考,并没有发现任何包的使用。 这意味着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安装文档,发现没有提及使用多核心进行安装。
TL; DR:Pip不会做你在问什么。 我可能是错的,因为我没有长时间看源代码,但我确信它不支持它。
解决这个问题的最终途径
因为所有的c / cpp文件都会使用make
commend进行编译, make
有一个选项可以指定使用多少个cpu核心来编译源代码,所以我们可以在make
上做一些技巧。
备份您的原始make
命令:
sudo cp /usr/bin/make /usr/bin/make.bak
编写一个“伪造” make
命令,它会将--jobs=6
附加到参数列表中,并将它们传递给原始make命令make.bak
:
make.bak --jobs=6 $@
所以在那之后,甚至没有用c库编译python,而且其他包含c库的编译器也会加速编译6个内核。 实际上所有使用make
命令编译的文件都会加快速度。
还有祝你好运。
使用:-- install-option =“ - jobs = 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分钟。
--------------------------更新----------------------- -------
作为下面的注释,我最终使用了这样的技巧: cd /usr/bin
sudo mv make make.bak
touch make
然后编辑make: vim make
或者其他你喜欢的方式并输入: make.bak --jobs=6 $*
I我不熟悉bash,所以我不确定这是否是正确的bash代码。 我正在用windows写这篇评论。 关键是将make重命名为make.bak,然后创建一个新make,使用这个新make使用添加的参数调用make.bak --jobs = 6
上一篇: Pip build option to use multicore
下一篇: What are the differences between the threading and multiprocessing modules?