J'ai trouvé que pip n'utilise qu'un seul cœur lorsqu'il compile des paquets. Étant donné que certains packages python prennent un certain temps à construire à l'aide de pip, je voudrais utiliser le multicœur sur la machine. Lorsque vous utilisez Makefile, je peux le faire comme la commande suivante:
make -j4
Comment puis-je réaliser la même chose pour pip?
D'après ce que je peux dire, il ne semble pas que pip ait cette capacité, mais je peux me tromper.
Pour faire du multiprocessing dans python vous utilisez le package multiprocessing, [voici un guide que j'ai trouvé] ( http://pymotw.com/2/multiprocessing/basics.html =) sur la façon de le faire si vous êtes intéressé et ceci est un lien vers les documents python qui en parlent. J'ai également trouvé cette question utile, - Multiprocessing vs Threading Python , pour vous assurer que le multiprocessing a fait ce que je pensais, en tirant parti de plusieurs processeurs.
J'ai parcouru le code source de pip (disponible ici ) à la recherche d'une référence au package multiprocessing et je n'ai trouvé aucune utilisation du package. Cela signifierait que pip n'utilise/ne prend pas en charge le multitraitement. D'après ce que je peux dire, le /pip/commands/install.py
le fichier est celui qui intéresse votre question car il est appelé lorsque vous exécutez pip install <package>
. Pour ce fichier en particulier, les importations sont
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
que vous pouvez voir n'a aucune référence au package multiprocessing mais j'ai vérifié tous les autres fichiers juste pour être sûr.
De plus, j'ai vérifié la documentation d'installation de pip et je n'ai trouvé aucune référence à l'installation à l'aide de plusieurs cœurs.
TL; DR: Pip ne fait pas ce que vous demandez. Je peux me tromper car je n'ai pas regardé la source aussi longtemps, mais je suis pratiquement sûr que cela ne la supporte pas.
La manière ltime de résoudre ce problème
Parce que tous les fichiers c/cpp seraient compilés en utilisant make
commend, et make
a une option qui spécifie le nombre de cœurs de CPU à utiliser pour compiler le code source, nous pourrions faire quelques astuces sur make
.
Sauvegardez votre commande make
d'origine:
Sudo cp /usr/bin/make /usr/bin/make.bak
écrire une commande "fausse" make
, qui ajoutera --jobs=6
à sa liste de paramètres et les passera à la commande make originale make.bak
:
make.bak --jobs=6 $@
Donc après cela, même pas compiler python avec c libs, mais aussi d'autres contiennent c libs accélérerait la compilation de 6 cœurs. En fait, tous les fichiers compilés en utilisant la commande make
seront accélérer.
Et bonne chance.
Utilisez: - install-option = "- jobs = 6".
pip3 install --install-option="--jobs=6" PyXXX
J'ai la même demande qui utilise pip install pour accélérer la progression de la compilation. Mon pack cible est PySide. Au début j'utilise pip3 install pyside
, Cela me prend près de 30 minutes (AMD 1055T 6 cœurs, 10G RAM), un seul cœur prend 100% de charge.
Il n'y a aucun indice dans pip3 --help
, Mais j'ai trouvé beaucoup d'options comme pip install -u pyXXX
, Mais je ne savais pas ce qu'est '-u' et ce paramètre n'était pas dans pip --help
aussi. J'ai essayé 'pip3 install --help' et la réponse est venue: - install-option.
J'ai lu le code du code de PySide et j'ai trouvé un autre indice: OPTION_JOBS = has_option('jobs')
, j'ai mis ipdb.set_trace () là-bas et j'ai finalement compris comment utiliser le multicœur pour compiler en utilisant l'installation de pip.
cela m'a pris environ 6 minutes.
--------------------------mise à jour----------------------- -------
comme commentaire ci-dessous, j'ai finalement utilisé des astuces comme celle-ci: cd /usr/bin
Sudo mv make make.bak
touch make
puis modifiez make: vim make
ou une autre manière que vous aimez et tapez ceci: make.bak --jobs=6 $*
Je ne connais pas bash, donc je ne sais pas si c'est le code bash correct. J'écris ce commentaire dans Windows. La clé est renommer make en make.bak, puis créez une nouvelle marque, utilisez cette nouvelle marque pour appeler make.bak avec le paramètre ajouté --jobs = 6