2017-12-19 149 views
13

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, QueueArray (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ì đá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.

+0

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

+0

@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

+1

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

Trả lời

0

Vâng, Khi chúng ta nói về nhiều quá trình với trăn những điều này xảy ra:

  • Hệ điều hành toàn bộ công việc đa nhiệm
  • Các lựa chọn duy nhất cho đa lõi đồng thời
  • trùng lắp sử dụng tài nguyên hệ thống

Có sự khác biệt rất lớn giữa osx và linux. và osx được dựa trên Unix và xử lý nhiều quá trình tác vụ theo cách khác với Linux.

Cài đặt Unix yêu cầu máy móc phần cứng nghiêm ngặt và được xác định rõ và chỉ hoạt động trên các máy CPU cụ thể và có thể osx không được thiết kế để tăng tốc quy trình python. Lý do này có thể là nguyên nhân.

Để biết thêm chi tiết, bạn có thể đọc tài liệu MultiProcessing.

Tôi hy vọng điều đó sẽ hữu ích.

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