2013-07-09 32 views
19

Tôi là một sinh viên tốt nghiệp kỹ thuật hiện đang thực hiện việc chuyển đổi từ MATLAB sang Python với mục đích mô phỏng bằng số. Tôi đã bị ấn tượng vì thao tác mảng cơ bản, Numpy sẽ nhanh như MATLAB. Tuy nhiên, nó xuất hiện cho hai chương trình khác nhau tôi viết rằng MATLAB là một chút dưới hai lần nhanh như Numpy. Các mã kiểm tra Tôi đang sử dụng cho numpy (Python 3.3) là:MATLAB hai lần nhanh như Numpy

import numpy as np 
import time 

a = np.random.rand(5000,5000,3) 

tic = time.time() 
a[:,:,0] = a[:,:,1] 
a[:,:,2] = a[:,:,0] 
a[:,:,1] = a[:,:,2] 
toc = time.time() - tic 
print(toc) 

Trong khi cho MATLAB 2012a Tôi đang sử dụng:

a = rand(5000,5000,3); 

tic; 
a(:,:,1) = a(:,:,2); 
a(:,:,3) = a(:,:,1); 
a(:,:,2) = a(:,:,3); 
toc 

Thuật toán tôi đang sử dụng là một trong những sử dụng trên một NASA website so sánh Numpy và MATLAB. Trang web cho thấy Numpy vượt qua MATLAB về mặt tốc độ cho thuật toán này. Tuy nhiên, kết quả của tôi cho thấy thời gian mô phỏng 0,49 s cho Numpy và thời gian mô phỏng 0,29 giây cho MATLAB. Tôi cũng đã chạy một bộ giải Gauss-Seidel trên cả Numpy và Matlab và tôi nhận được kết quả tương tự (16,5 s so với 9,5 s)

Tôi mới sử dụng Python và không vô cùng biết chữ về lập trình. Tôi đang sử dụng phân phối Python WinPython 64 bit nhưng cũng đã thử Pythonxy không có kết quả.

Một điều tôi đã đọc nên cải thiện hiệu suất là xây dựng Numpy bằng cách sử dụng MKL. Thật không may tôi không có ý tưởng làm thế nào để làm điều này trên Windows. Tôi thậm chí cần phải làm điều này?

Mọi đề xuất?

+0

Christoph Gohlke cung cấp các tệp nhị phân Windows được biên dịch sẵn cho nhiều gói Python, với NumPy được liên kết với Intel MKL: http://www.lfd.uci.edu/~gohlke/pythonlibs/ – Amro

+0

Đúng. Python sử dụng thậm chí còn chậm hơn so với Matlab nên bạn may mắn. :-) – horchler

+2

Phân phối hiện tại của WinPython [đã đi kèm với NumPy-MKL] (https://code.google.com/p/winpython/wiki/PackageIndex_33). – Jaime

Trả lời

51

Việc so sánh đó kết thúc bằng việc chuyển sang cam do lưu vào bộ nhớ đệm, vì việc chuyển giao hoặc thực hiện một số công việc trên bộ nhớ liền kề sẽ hiệu quả hơn. Điểm chuẩn đặc biệt này là bộ nhớ bị ràng buộc, vì trên thực tế không có tính toán được thực hiện, và do đó tỷ lệ phần trăm của lần truy cập bộ nhớ cache là chìa khóa để đạt được hiệu suất tốt.

Matlab đặt dữ liệu theo thứ tự cột lớn (thứ tự Fortran), vì vậy a(:,:,k) là một đoạn bộ nhớ liền kề, nhanh chóng sao chép.

Đặt hàng mặc định theo thứ tự hàng lớn (thứ tự C), vì vậy trong a[:,:,k] có các bước nhảy lớn giữa các phần tử và làm chậm tốc độ truyền bộ nhớ. Trên thực tế, bố cục dữ liệu có thể được chọn. Trong máy tính xách tay của tôi, tạo mảng với a = np.asfortranarray(np.random.rand(5000,5000,3)) dẫn đến tốc độ 5x lên (1 s so với 0,19 giây).Kết quả này sẽ rất giống nhau cho cả numpy-MKL và plain numpy vì MKL là một triển khai LAPACK nhanh và ở đây bạn không gọi bất kỳ chức năng nào sử dụng nó (MKL chắc chắn sẽ giúp khi giải các hệ thống tuyến tính, các sản phẩm dot tính toán). ..).

Tôi không thực sự biết những gì đang xảy ra trên bộ giải Gauss Seidel, nhưng một thời gian trước tôi đã viết câu trả lời cho một câu hỏi có tiêu đề Numpy running at half the speed of MATLAB nói một chút về MKL, FFT và JIT của Matlab.

+0

Tôi chỉ nhận thấy điều này đã được giảm giá (đó là lần đầu tiên đối với tôi). Bất kỳ ý kiến ​​về làm thế nào để cải thiện câu trả lời? – jorgeca

+0

Ok, tôi đã thử đề xuất của bạn bằng cách sử dụng mảng xây dựng khác nhau và nó cũng dẫn đến tốc độ ~ 5x trong Numpy, điều này thật tuyệt. Tôi đã thử đề xuất này với người giải quyết Gauss-Seidel của tôi và nó không đưa ra cải tiến nào cho thấy có một vấn đề khác. Tôi không sử dụng bất kỳ chức năng ưa thích hoặc bất cứ điều gì trong bộ giải này, nó là khá nhiều chỉ là một vòng lặp trong khi với khoảng 16 dòng vectorized bài tập và một vài điều khiển báo cáo. Những gì bạn đã viết trong chủ đề cũ cũng không giúp tôi. Có cách nào tôi có thể gửi cho bạn mã của tôi để kiểm tra, hoặc có thể hỏi nó trong một câu hỏi mới? – nicholls

+0

Vì vấn đề có vẻ khác, bạn có thể hỏi một câu hỏi khác để nhiều người hơn có thể hưởng lợi từ nó! – jorgeca

3

Bạn đang cố tạo lại thử nghiệm của NASA, tuy nhiên bạn đã thay đổi nhiều biến số. Ví dụ:

  • phần cứng của bạn và hệ điều hành khác nhau (www.nccs.nasa.gov/dali_front.html)
  • phiên bản Python của bạn là khác nhau (2.5.3 vs 3.3)
  • phiên bản MATLAB của bạn khác (2008 so với 2012)

Giả sử kết quả của NASA là chính xác, sự khác biệt về kết quả là do một hoặc nhiều biến được thay đổi này. Tôi khuyên bạn nên:

  • Hãy thử lại với SciPy được dựng sẵn binaries.
  • Nghiên cứu nếu có bất kỳ cải tiến nào đối với MATLAB liên quan đến loại phép tính này.

Ngoài ra, bạn có thể tìm thấy this link hữu ích.

+0

Ban đầu tôi đã thử so sánh với nghiên cứu của NASA, tuy nhiên, tôi đã yêu cầu chủ yếu để xem có điều gì tôi có thể làm (hoặc điều gì đó hiển nhiên) có thể khiến Numpy chậm gấp hai lần. Nếu câu trả lời là phiên bản MATLAB tôi đang sử dụng chỉ nhanh hơn, thì đó là tất cả những gì tôi cần. Cảm ơn, mặc dù. – nicholls

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