2013-06-23 33 views
5

Có thể tăng tốc một tác vụ bằng cách sử dụng đa xử lý/luồng không? Cảm giác ruột của tôi là câu trả lời là 'không'. Dưới đây là ví dụ về ý nghĩa của một "nhiệm vụ duy nhất":Tăng tốc một nhiệm vụ bằng cách sử dụng đa xử lý hoặc luồng

for i in range(max): 
    pick = random.choice(['on', 'off', 'both']) 

Với đối số 10000000 mất khoảng 7,9 giây để hoàn thành trên hệ thống của tôi.

Tôi có nắm bắt cơ bản về cách sử dụng đa xử lý và luồng cho nhiều tác vụ. Ví dụ: nếu tôi có 10 thư mục, mỗi thư mục chứa X số tệp cần được đọc, tôi có thể sử dụng tạo 10 chuỗi.

Tôi nghi ngờ rằng tác vụ đơn lẻ chỉ sử dụng một quy trình (trình quản lý tác vụ báo cáo mức sử dụng CPU tối thiểu). Có cách nào để tận dụng các lõi khác của tôi trong những trường hợp như vậy không? Hoặc là tăng CPU/bộ nhớ tốc độ cách duy nhất để có được kết quả nhanh hơn?

+6

đa xử lý có thể giúp, nhiều luồng trong một quá trình không nhiều (từ khóa: "khóa thông dịch toàn cục" hay còn gọi là "GIL") –

+0

@Michael Butsher: Bạn có thể cung cấp ví dụ về cách tôi có thể chia nhỏ mã tôi đã đề cập bằng cách sử dụng đa xử lý hay không ? –

+3

Bạn có thể đọc http://mikecvet.wordpress.com/2010/07/02/parallel-mapreduce-in-python/ để xem ví dụ –

Trả lời

5

Dưới đây là một chuẩn mực của mã của bạn có và không có đa:

#!/usr/bin/env python 

import random 
import time 

def test1(): 
    print "for loop with no multiproc: " 
    m = 10000000 
    t = time.time() 
    for i in range(m): 
     pick = random.choice(['on', 'off', 'both']) 
    print time.time()-t 

def test2(): 
    print "map with no multiproc: " 
    m = 10000000 
    t = time.time() 
    map(lambda x: random.choice(['on', 'off', 'both']), range(m)) 
    print time.time()-t 

def rdc(x): 
    return random.choice(['on', 'off', 'both']) 

def test3(): 
    from multiprocessing import Pool 

    pool = Pool(processes=4) 
    m = 10000000 

    print "map with multiproc: " 
    t = time.time() 

    r = pool.map(rdc, range(m)) 
    print time.time()-t 

if __name__ == "__main__": 
    test1() 
    test2() 
    test3() 

Và đây là kết quả trên máy trạm của tôi (mà là một quadcore):

for loop with no multiproc: 
8.31032013893 
map with no multiproc: 
9.48167610168 
map with multiproc: 
4.94983720779 

Có thể để tăng tốc độ một tác vụ bằng cách sử dụng đa xử lý/luồng? Cảm giác ruột của tôi là câu trả lời là 'không'.

tốt, từ xa, câu trả lời là "chết tiệt, vâng".

Có cách nào để tận dụng các lõi khác của tôi trong những trường hợp như vậy không? Hoặc là tăng CPU/bộ nhớ tốc độ cách duy nhất để có được kết quả nhanh hơn?

có, bằng cách sử dụng đa xử lý. Python không thể xử lý nhiều lõi bằng cách sử dụng luồng, vì GIL, nhưng nó có thể dựa vào bộ lập lịch của hệ điều hành để tận dụng các lõi khác. Sau đó, bạn có thể nhận được một cải tiến thực sự về nhiệm vụ của mình.

+1

Câu trả lời là "chết tiệt, có" chỉ khi bạn đang sử dụng một máy tính tốt. Trên netbook của tôi, test3 chậm hơn test1. – michaelmeyer

+1

câu trả lời "damn yes" phụ thuộc vào số lõi mà máy tính của bạn có. Nếu bạn tạo một nhóm các tiến trình có cùng số lượng các tiến trình mà bạn có lõi, thì bạn sẽ thu được từ đó (cho bạn có nhiều hơn một lõi). Nếu bạn không làm như vậy sẽ giống nhau (lịch trình không làm phép lạ). – zmo

+1

@zmo: 3:16 có thể đã hét lên "Địa ngục, yeah!", Nhưng "chết tiệt, có" cũng hoạt động :) Cảm ơn bạn. –

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