2012-07-05 74 views
28

Tôi đang cố gắng tìm hiểu cách sử dụng gói đa xử lý của Python, nhưng tôi không hiểu sự khác biệt giữa mapimap.Xử lý đa nhân Python: Sự khác nhau giữa bản đồ và imap là gì?

Sự khác biệt là map trả về, ví dụ: một mảng hoặc tập hợp thực tế, trong khi imap trả về một trình lặp trên một mảng hoặc tập hợp? Khi nào tôi sử dụng cái kia?

Ngoài ra, tôi không hiểu đối số là gì. Đây có phải là số lượng giá trị được chuyển cho mỗi quy trình không?

+1

Liên quan chặt chẽ: [multiprocessing.pool: Sự khác biệt giữa map_async và imap?] (Http://stackoverflow.com/questions/26520781/multiprocessing-pool-whats-the-difference-between-map-async-and -imap/26521507 # 26521507) – dano

Trả lời

25

Đó là sự khác biệt. Một lý do tại sao bạn có thể sử dụng imap thay vì bản đồ là nếu bạn muốn bắt đầu xử lý một vài kết quả đầu tiên mà không phải đợi phần còn lại được tính toán. bản đồ chờ đợi mọi kết quả trước khi trở về.

Đối với chunksize, đôi khi nó hiệu quả hơn để chia ra công việc với số lượng lớn hơn bởi vì mỗi khi công nhân yêu cầu nhiều công việc hơn, có IPC và phí đồng bộ hóa.

+0

Vậy cách tiếp cận xác định một giá trị hợp lý cho việc chunksize như thế nào? Nếu lớn hơn có nghĩa là ít hơn IPC và đồng bộ trên không do tẩy, sự cân bằng là gì? (tức là tại sao chọn 'chunksize == len (iterable)' một ý tưởng tồi, hay là nó?) –

+0

@Adam Nếu bạn chọn 'chunksize = len (iterable)', thì tất cả các công việc sẽ được gán cho một tiến trình duy nhất! 'len (iterable) // numprocesses' là số tối đa hữu ích. Sự cân bằng giữa chi phí đồng bộ hóa và sử dụng cpu (khối lượng lớn sẽ gây ra một số quá trình hoàn thành trước khi những người khác, lãng phí thời gian xử lý tiềm năng). – Antimony

+0

Ok, tôi thấy điều đó, nhưng điều đó đơn giản chỉ có nghĩa là chọn một khối nhỏ hợp lý xuống để thử nghiệm và lỗi trên dữ liệu cụ thể trong một thiết lập cụ thể? –

0

imap là từ itertools mô-đun được sử dụng cho hiệu quả nhanh và bộ nhớ trong python.Map sẽ trở lại danh sách nơi như imap trả về đối tượng mà tạo ra các giá trị cho mỗi lần lặp (Trong python 2.7) .Công dưới đây khối mã sẽ xóa sự khác biệt.

Bản đồ trả về danh sách có thể được in trực tiếp

from itertools import * 
    from math import * 

    integers = [1,2,3,4,5] 
    sqr_ints = map(sqrt, integers) 
    print (sqr_ints) 

lợi nhuận imap đối tượng được chuyển đổi sang liệt kê và in ra.

from itertools import * 
from math import * 

integers = [1,2,3,4,5] 
sqr_ints = imap(sqrt, integers) 
print list(sqr_ints) 

Chunksize sẽ làm cho các iterable được chia thành từng miếng nhỏ kích thước quy định (ước tính) và mỗi phần được gửi như một nhiệm vụ riêng biệt.

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