Tôi đã cố gắng tìm hiểu thêm về mô-đun multiprocessing
của Python và để đánh giá các kỹ thuật khác nhau để liên lạc giữa các quy trình. Tôi đã viết một điểm chuẩn so sánh hiệu suất của Pipe
, Queue
và Array
(tất cả từ multiprocessing
) để chuyển numpy
mảng giữa các quá trình. Bạn có thể tìm thấy điểm chuẩn đầy đủ here. Dưới đây là một đoạn trong bài kiểm tra cho Queue
:Sự khác biệt hiệu suất giữa OSX và Linux để giao tiếp bằng cách sử dụng đa xử lý Python
def process_with_queue(input_queue, output_queue):
source = input_queue.get()
dest = source**2
output_queue.put(dest)
def test_with_queue(size):
source = np.random.random(size)
input_queue = Queue()
output_queue = Queue()
p = Process(target=process_with_queue, args=(input_queue, output_queue))
start = timer()
p.start()
input_queue.put(source)
result = output_queue.get()
end = timer()
np.testing.assert_allclose(source**2, result)
return end - start
Tôi chạy thử nghiệm này trên máy tính xách tay Linux của tôi và nhận được kết quả như sau cho một kích thước mảng của 1000000:
Using mp.Array: time for 20 iters: total=2.4869s, avg=0.12435s
Using mp.Queue: time for 20 iters: total=0.6583s, avg=0.032915s
Using mp.Pipe: time for 20 iters: total=0.63691s, avg=0.031845s
Tôi là một chút ngạc nhiên khi thấy Array
hoạt động kém vì nó sử dụng bộ nhớ chia sẻ và có lẽ không yêu cầu tẩy, nhưng tôi cho rằng phải có một số bản sao trong numpy
mà tôi không thể kiểm soát.
Tuy nhiên, tôi chạy thử nghiệm tương tự (một lần nữa cho kích thước mảng 1000000) trên Macbook, và nhận được kết quả như sau:
Using mp.Array: time for 20 iters: total=1.6917s, avg=0.084587s
Using mp.Queue: time for 20 iters: total=2.3478s, avg=0.11739s
Using mp.Pipe: time for 20 iters: total=8.7709s, avg=0.43855s
Sự khác biệt thời gian thực không phải là đáng ngạc nhiên vì tất nhiên hệ thống khác nhau sẽ thể hiện hiệu suất khác nhau. Điều gì là đáng ngạc nhiên là sự khác biệt về thời gian tương đối.
Điều gì có thể giải thích cho điều này? Đây là một kết quả khá đáng ngạc nhiên đối với tôi. Tôi sẽ không ngạc nhiên khi thấy sự khác biệt rõ rệt giữa Linux và Windows, hoặc OSX và Windows, nhưng tôi giả định rằng những thứ này sẽ hoạt động rất giống nhau giữa OSX và Linux.
This question giải quyết sự khác biệt về hiệu suất giữa Windows và OSX, điều này dường như được mong đợi nhiều hơn.
Các loại 'Giá trị' và' Mảng 'dựa vào 'Khóa' để đảm bảo an toàn dữ liệu. Có được một khóa là một hành động khá tốn kém vì nó đòi hỏi phải chuyển sang chế độ hạt nhân. Mặt khác, việc tuần tự hóa cấu trúc dữ liệu đơn giản là những gì CPU hiện đại làm hầu hết thời gian nên chi phí của nó khá thấp. Việc xóa 'Khóa' khỏi' Mảng' sẽ hiển thị hiệu suất tốt hơn nhưng bạn không thể loại trừ điều kiện cuộc đua trên dữ liệu. – noxdafox
@noxdafox nếu bạn xem xét mã điểm chuẩn đầy đủ, bạn sẽ thấy rằng tôi thực sự không sử dụng khóa cho phần 'Array' của điểm chuẩn. Và thậm chí sau đó điều này sẽ chỉ tính đến hiệu năng tương đối kém của 'Array' trên Linux, nhưng nó không nhất thiết phải giải thích sự khác biệt giữa Linux và OSX. – ddavella
Macbook của bạn có ổ đĩa trạng thái rắn và máy tính xách tay Linux của bạn là một đĩa quay không? – Hannu