2014-10-07 15 views
38

Tôi thấy rằng pip chỉ sử dụng lõi đơn khi biên dịch gói. Kể từ khi một số gói python mất một thời gian để xây dựng bằng cách sử dụng pip, tôi muốn sử dụng đa lõi trên máy. Khi sử dụng Makefile, tôi có thể làm điều đó như sau lệnh:Tùy chọn xây dựng đường ống để sử dụng đa lõi

make -j4 

Làm thế nào tôi có thể đạt được điều tương tự cho pip?

+0

có thể trùng lặp của [Parallel Pip install] (http: // stackoverflow.com/questions/11021130/parallel-pip-install) –

+3

Tôi không nghĩ rằng đây là câu hỏi trùng lặp. Trong chủ đề "Cài đặt song song Pip", nếu tôi hiểu chính xác, tác giả muốn chạy nhiều quy trình cài đặt pip. Ngược lại, những gì tôi muốn làm là cài đặt một gói bằng cách sử dụng nhiều lõi. – Jihun

+1

theo như tôi biết điều này không được triển khai. Lệnh build_ext phải được tùy chỉnh để đạt được điều này. – marscher

Trả lời

2

Từ những gì tôi có thể nói, có vẻ như pip không có khả năng này nhưng tôi có thể bị nhầm lẫn.

Để thực hiện đa xử lý trong python bạn sử dụng gói đa xử lý, [đây là hướng dẫn tôi tìm thấy] (http://pymotw.com/2/multiprocessing/basics.html) về cách thực hiện nếu bạn quan tâm và đây là tài liệu python nói về nó. Tôi cũng tìm thấy câu hỏi này hữu ích, Multiprocessing vs Threading Python, để đảm bảo rằng đa xử lý đã làm những gì tôi nghĩ rằng nó đã làm, đang tận dụng lợi thế của nhiều CPU.

Tôi đã đi qua mã nguồn pip (có sẵn here) tìm kiếm tham chiếu đến gói đa xử lý và không tìm thấy bất kỳ việc sử dụng gói nào. Điều này có nghĩa là pip không sử dụng/hỗ trợ đa xử lý. Từ những gì tôi có thể cho biết tệp /pip/commands/install.py là một trong những lợi ích cho câu hỏi của bạn vì nó được gọi khi bạn chạy pip install <package>. Đối với tệp này, nhập cụ thể là

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 

mà bạn có thể thấy không có tham chiếu đến gói đa xử lý nhưng tôi đã kiểm tra tất cả các tệp khác chỉ để chắc chắn.

Hơn nữa, tôi đã kiểm tra pip install documentation và không tìm thấy tham chiếu đến cài đặt bằng nhiều lõi.

TL; DR: Pip không làm những gì bạn đang yêu cầu. Tôi có thể sai vì tôi đã không nhìn vào nguồn dài nhưng tôi khá chắc chắn nó chỉ không hỗ trợ nó.

+0

Đó là một lập luận hợp lý mặc dù tôi hơi thất vọng rằng pip không hỗ trợ tính năng này ... Cảm ơn bạn rất nhiều vì đã phân tích. – Jihun

+1

Câu trả lời này đã lỗi thời. Xem câu trả lời của Plasmatium dưới đây. –

24

Các Cuối cùng Way để giải quyết này vấn đề

Bởi vì tất cả các c/file cpp sẽ được biên dịch bằng cách sử dụng make khen, và make có một tùy chọn trong đó quy định có bao nhiêu lõi CPU shoule được sử dụng để biên dịch mã nguồn mã, chúng tôi có thể thực hiện một số thủ thuật trên make.

  1. sao lưu ban đầu của bạn make lệnh:

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

  2. viết một "giả" make lệnh, mà sẽ nối --jobs=6 vào danh sách tham số của nó và vượt qua chúng để làm cho ban lệnh make.bak:

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

Vì vậy, sau đó, thậm chí không biên dịch python với libs c, nhưng cũng có những người khác chứa libs c sẽ tăng tốc độ biên dịch bởi 6 lõi. Trên thực tế tất cả các tệp được biên dịch bằng cách sử dụng lệnh make sẽ tăng tốc.

Và chúc may mắn.


Sử dụng: -install-option = "- việc làm = 6".

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

Tôi có cùng nhu cầu sử dụng pip install để tăng tốc độ tiến trình biên dịch. Pkg mục tiêu của tôi là PySide. Lúc đầu, tôi sử dụng pip3 install pyside, tôi mất gần 30 phút (AMD 1055T 6-lõi, RAM 10G), chỉ một lõi tải 100%.

Không có manh mối nào trong pip3 --help, nhưng tôi đã tìm thấy nhiều tùy chọn như pip install -u pyXXX, nhưng tôi không biết '-u' là gì và thông số này cũng không nằm trong số pip --help. Tôi đã thử 'pip3 install --help' và có câu trả lời: --install-option.

Tôi đọc mã của mã PySide và tìm thấy một đầu mối khác: OPTION_JOBS = has_option('jobs'), tôi đặt ipdb.set_trace() ở đó và cuối cùng cũng hiểu cách sử dụng đa lõi để biên dịch bằng cách sử dụng pip install.

tôi mất khoảng 6 phút.

-------------------------- cập nhật ------------------- -----------

như bình luận dưới đây, cuối cùng tôi đã sử dụng thủ đoạn như thế này: cd /usr/bin sudo mv make make.bak touch make sau đó chỉnh sửa thực hiện: vim make hay cách khác mà bạn thích và gõ này: make.bak --jobs=6 $* Tôi không quen thuộc với bash, vì vậy tôi không chắc chắn nếu đây là mã bash correcct. Tôi đang viết bình luận này trong cửa sổ. Điều quan trọng là đổi tên thành make.bak, và sau đó tạo ra một make mới, sử dụng make mới này để gọi make.bak với thêm param --jobs = 6

+0

Dường như hoạt động - tải bộ vi xử lý tăng lên trên tất cả các lõi của tôi khi tôi chạy theo cách này. – BenB

+0

Tôi nhận cảnh báo 'UserWarning: Vô hiệu hóa tất cả việc sử dụng bánh xe do việc sử dụng các tùy chọn --build-options/--global-options/--install-options.'. Nó có ý nghĩa, nhưng nó có khả năng là lợi ích hiệu suất của việc sử dụng nhiều lõi vượt quá hiệu suất hit của không sử dụng bánh xe? Nó phụ thuộc vào điều gì? – max

+0

Còn pip (không phải pip3) thì sao? Tôi nhận được: 'lỗi: tùy chọn --jobs không được công nhận' – timotheecour

Các vấn đề liên quan