web-dev-qa-db-fra.com

Option de génération de pip pour utiliser le multicœur

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?

43
Jihun

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.

4
guribe94

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.

  1. Sauvegardez votre commande make d'origine:

    Sudo cp /usr/bin/make /usr/bin/make.bak

  2. é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/binSudo mv make make.baktouch 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

26
Plasmatium