Вариант построения протокола для использования многоядерных процессоров
Я обнаружил, что при использовании пакетов только один ядро при компиляции пакетов. Поскольку некоторые пакеты python занимают некоторое время, чтобы построить с помощью pip, я бы хотел использовать multicore на машине. При использовании Makefile я могу сделать это, как следующая команда:
make -j4
Как я могу достичь такой же цели для pip?
Ответы
Ответ 1
Из того, что я могу сказать, не похоже, что у пип есть эта способность, но я могу ошибаться.
Чтобы выполнить многопроцессорную обработку на python, вы используете пакет многопроцессорности, [здесь приведено руководство] (http://pymotw.com/2/multiprocessing/basics.html) о том, как сделайте это, если вы заинтересованы, и это ссылка в документы python, которые говорят об этом. Я также нашел этот вопрос полезным, Multiprocessing vs Threading Python, чтобы убедиться, что многопроцессорность сделала то, что я думал, что это так, используя преимущества нескольких процессоров.
Я прошел через исходный код 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
который вы можете видеть, не имеет ссылки на пакет многопроцессорности, но я проверял все остальные файлы, чтобы убедиться.
Кроме того, я проверил описать документацию по установке и не нашел ссылки на установку с использованием нескольких ядер.
TL; DR: Pip не делает то, что вы просите. Возможно, я ошибаюсь, поскольку долго не смотрел на источник, но я уверен, что он просто не поддерживает его.
Ответ 2
Ultimate Способ решения этой проблемы
Поскольку все файлы c/cpp будут скомпилированы с помощью make
commend, а make
имеет параметр, который определяет, сколько cpu-ядер будет использоваться для компиляции исходного кода, мы могли бы сделать некоторые трюки на make
.
-
Сохраните исходную команду make
:
sudo cp /usr/bin/make /usr/bin/make.bak
-
напишите команду "fake" make
, которая добавит --jobs=6
в свой список параметров и передаст их в исходную команду make make.bak
:
make.bak --jobs=6 [email protected]
Итак, после этого даже не скомпилировать python с c libs, а также другие, содержащие c libs, ускоряются при компиляции на 6 ядер. Фактически все файлы, скомпилированные с помощью команды make
, будут ускоряться.
И удачи.
Использование: - install-option = "- jobs = 6" .
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' и пришел ответ: - установка-вариант.
Я прочитал код кода PySide и нашел еще один ключ: OPTION_JOBS = has_option('jobs')
, я положил ipdb.set_trace() и наконец понял, как использовать multicore для компиляции с помощью pip install.
мне потребовалось около 6 минут.
-------------------------- обновление -------------------- ----------
как комментарий ниже, я, наконец, использовал трюки:
cd /usr/bin
sudo mv make make.bak
touch make
затем отредактируйте make: vim make
или другим способом, который вам нравится, и введите следующее:
make.bak --jobs=6 $*
Я не знаком с bash, поэтому я не уверен, что это код коррекции bash. Я пишу этот комментарий в окнах. Ключ переименовать make в make.bak, а затем создать новый make, использовать этот новый make для вызова make.bak с добавлением param --jobs = 6