Hướng dẫn does matlab run faster than python? - matlab có chạy nhanh hơn python không?

Bạn có thể tìm thấy một số kết quả hữu ích ở dưới cùng của liên kết này

//wiki.scipy.org/PerformancePython

Từ phần giới thiệu,

Một so sánh về dệt với Numpy, Pyrex, Psyco, Fortran [77 và 90] và C ++ để giải phương trình của Laplace.

Nó cũng so sánh MATLAB và dường như cho thấy tốc độ tương tự như khi sử dụng Python và Numpy.

Tất nhiên đây chỉ là một ví dụ cụ thể, ứng dụng của bạn có thể cho phép hiệu suất tốt hơn hoặc kém hơn. Không có tác hại trong việc chạy cùng một bài kiểm tra trên cả hai và so sánh.

Bạn cũng có thể biên dịch Numpy với các thư viện được tối ưu hóa như Atlas cung cấp một số thói quen Blas/Lapack. Chúng nên có tốc độ tương đương với MATLAB.

Tôi không chắc liệu các bản tải xuống Numpy đã được xây dựng chống lại nó, nhưng tôi nghĩ Atlas sẽ điều chỉnh các thư viện cho hệ thống của bạn nếu bạn biên dịch Numpy,

//www.scipy.org/Installing_SciPy/Windows

Liên kết có nhiều chi tiết hơn về những gì được yêu cầu trong nền tảng Windows.

EDIT:

Nếu bạn muốn tìm hiểu những gì hoạt động tốt hơn, C hoặc C ++, có thể đáng để hỏi một câu hỏi mới. Mặc dù từ liên kết trên C ++ có hiệu suất tốt nhất. Các giải pháp khác cũng khá gần, tức là Pyrex, Python/Fortran [sử dụng F2Py] và nội tuyến C ++.

Đại số ma trận duy nhất theo C ++ tôi từng thực hiện là sử dụng MTL và triển khai bộ lọc Kalman mở rộng. Mặc dù vậy, tôi đoán, về bản chất, nó phụ thuộc vào các thư viện mà bạn đang sử dụng lapack/blas và mức độ tối ưu hóa của nó.

Liên kết này có một danh sách các gói số hướng đối tượng cho nhiều ngôn ngữ.

//www.oonumerics.org/oon/

Trong lưu ý này, tôi mở rộng một bài viết trước về so sánh tốc độ thời gian chạy của các gói kinh tế lượng khác nhau bằng cách

  1. Thêm Stata vào so sánh ban đầu của Matlab và Python
  2. Tính toán tốc độ thời gian chạy bằng cách
    • So sánh các hàm ước tính OLS đầy đủ cho từng gói
      • Stata:
        Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
        Send 'exit' command to kill the server
        ....MATLAB started and connected!
        
        6
      • MATLAB:
        Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
        Send 'exit' command to kill the server
        ....MATLAB started and connected!
        
        7
      • Python:
        Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
        Send 'exit' command to kill the server
        ....MATLAB started and connected!
        
        8 từ mô -đun
        Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
        Send 'exit' command to kill the server
        ....MATLAB started and connected!
        
        9.
    • So sánh thời gian chạy để tính toán bằng mã đại số tuyến tính cho mô hình OLS: $ [x'x]^{-1} x'y $
  3. Vì Stata và Matlab tự động hóa một số tính toán, chúng tôi song song hóa mã Python bằng mô -đun
    %%matlab -i reps,beta,n_array -o mat_time,store_beta
    
    mat_time = zeros[cols[n_array],2];
        
    for i=1:cols[n_array]
    n=n_array[i];
    row_id =1:n;
    X = [normrnd[10,4,[n 2]] ones[n,1]];
    
    Y = X*beta' + normrnd[0,1,[n 1]];
    
        store_beta = zeros[reps,3]; 
        tic;
        for r = 1:reps
           this_row = randsample[row_id,n,true];
           est = fitlm[X[this_row,:],Y[this_row],'linear','Intercept',false];
           store_beta[r,:] = [est.Coefficients.Estimate]'; 
        end
        mat_time[i,:] = [n toc];
    end
    
    0.

Ngoài những điều trên, tôi đã cố gắng thực hiện một số tối ưu hóa bằng cách sử dụng mô -đun Numba Python, đã được chứng minh là mang lại tốc độ tăng tốc đáng chú ý, nhưng không thấy cải thiện hiệu suất cho mã của tôi.

Vấn đề tính toán được xem xét ở đây là một bootstrap khá lớn của một mô hình OLS đơn giản và được mô tả chi tiết trong bài trước.

tl;dr

Các vấn đề kinh tế lượng tốn thời gian được thực hiện tốt nhất trong Python hoặc Matlab. Dựa trên sự so sánh này, Stata chậm hơn đáng kể [đặc biệt là khi xử lý song song trong Python hoặc Matlab].

MATLAB là nền tảng nhanh nhất khi mã tránh việc sử dụng các hàm MATLAB nhất định [như

Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
7]. Mặc dù chậm hơn, Python so sánh thuận lợi với MATLAB, đặc biệt với khả năng sử dụng hơn 12 lõi xử lý khi chạy song song.

In [1]:

%matplotlib inline
import warnings
warnings.filterwarnings['ignore']
import numpy as np
import pandas as pd
import statsmodels.api as sm
from timeit import timeit
from numba import double
from numba.decorators import jit, autojit
from joblib import Parallel, delayed

Đối với các lỗi tiêu chuẩn boostrapping, chúng tôi sẽ xem xét 1.000 bản sao sao chép Bootstrap. Chúng tôi sẽ khám phá một số kích thước mẫu [$ n = \ started {bmatrix} 1000 & 10.000 & 100.000 \ end {bmatrix} $] cho các biến phụ thuộc và độc lập bên dưới. Các tham số thực là $$ \ beta = \ start

In [2]:

reps, beta, n_array = 1000, [-.5,.5,10], [1000, 10000, 100000]

So sánh bootstrapping với các chức năng OLS

So sánh đầu tiên chúng tôi sẽ thực hiện sử dụng các chức năng sau:

function
Stata
Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
6
Matlab
Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
7
Python
Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
8

Những gì được tính toán

Điều quan trọng cần lưu ý là một số tính năng của các chức năng OLS này. Lệnh Stata

Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
6 chỉ tính toán các lỗi tiêu chuẩn mạnh mẽ theo yêu cầu [cần xác minh điều này], trong khi
Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
7 và
Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
8 tính toán một số biến thể của các lỗi tiêu chuẩn mạnh mẽ và tất cả các yếu tố khác đều chạy chậm hơn do các tính toán bổ sung này.

Nhiều luồng và xử lý song song

Trong Stata và Matlab,

Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
6 và
Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
7 tự động được nhiều luồng mà không có bất kỳ sự can thiệp nào của người dùng. Do đó, tất cả các yếu tố khác bằng Python bằng nhau sẽ chạy chậm hơn vì theo mặc định
Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
8 không được đa luồng. Những bình luận này dựa trên tải CPU quan sát của tôi bằng lệnh UNIX
matlab_results = pd.DataFrame[store_beta.copy[],columns=['b1','b2','constant']]
matlab_results.describe[percentiles=[.01,.025,.5,.95,.975,.99]]
1. Python không bao giờ vượt quá 100%, trong khi Stata và Matlab mở rộng ra phạm vi 200% đến 300%.

Đầu tiên hãy xem xét bootstrap trong matlab¶

Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!

In [4]:

%%matlab -i reps,beta,n_array -o mat_time,store_beta

mat_time = zeros[cols[n_array],2];
    
for i=1:cols[n_array]
n=n_array[i];
row_id =1:n;
X = [normrnd[10,4,[n 2]] ones[n,1]];

Y = X*beta' + normrnd[0,1,[n 1]];

    store_beta = zeros[reps,3]; 
    tic;
    for r = 1:reps
       this_row = randsample[row_id,n,true];
       est = fitlm[X[this_row,:],Y[this_row],'linear','Intercept',false];
       store_beta[r,:] = [est.Coefficients.Estimate]'; 
    end
    mat_time[i,:] = [n toc];
end

Dưới đây là kết quả cho $ n = 100.000 $.

In [5]:

matlab_results = pd.DataFrame[store_beta.copy[],columns=['b1','b2','constant']]
matlab_results.describe[percentiles=[.01,.025,.5,.95,.975,.99]]

Out[5]:

b1b2không thay đổiđếmbần tiệnSTDTối thiểu1%2.5%50%95%97.5%99%Tối đa
1000.000000 1000.000000 1000.000000
-0.500783 0.499098 10.012360
0.000778 0.000803 0.011445
-0.503204 0.496346 9.974214
-0.502515 0.497165 9.984511
-0.502226 0.497509 9.991038
-0.500783 0.499143 10.012116
-0.499493 0.500333 10.031592
-0.499266 0.500623 10.035487
-0.499011 0.500946 10.038212
-0.498060 0.501551 10.046288

Cùng một bootstrap trong Python¶

Dưới đây là chức năng Python thực hiện từng bản sao của bootstrap. Nó lấy mẫu với sự thay thế từ dữ liệu, tính toán các ước tính OLS và lưu chúng trong một ma trận numpy.

In [6]:

def python_boot[arg_reps,arg_row_id,arg_n,arg_X,arg_Y]:
    store_beta = np.zeros[[reps,X.shape[1]]]
    for r in range[arg_reps]:
        this_sample = np.random.choice[arg_row_id, size=arg_n, replace=True] # gives sampled row numbers
        # Define data for this replicate:    
        X_r = arg_X[this_sample,:]
        Y_r = arg_Y[this_sample]
        # Estimate model 
        store_beta[r,:] = sm.regression.linear_model.OLS[Y_r,X_r].fit[disp=0].params
    return store_beta

MATLAB sử dụng trình biên dịch đúng thời gian để dịch mã sang thực thi nhị phân máy. Điều này làm tăng đáng kể tốc độ và dường như không từ góc độ người dùng vì nó được thực hiện tự động trong nền khi một tập lệnh được chạy. Dự án Python Numba đã phát triển một trình biên dịch thời gian tương tự, với mã hóa bổ sung rất tối thiểu cần thiết. Người ta chỉ cần thêm

matlab_results = pd.DataFrame[store_beta.copy[],columns=['b1','b2','constant']]
matlab_results.describe[percentiles=[.01,.025,.5,.95,.975,.99]]
2 trước các chức năng bạn muốn biên dịch, như được hiển thị bên dưới:

In [7]:

@jit[nogil=True]
# rewriting python_boot to make function args explicit:
def python_boot_numba[arg_reps,arg_row_id,arg_n,arg_X,arg_Y]:
    store_beta = np.zeros[[1000,3]]
    for r in range[arg_reps]:
        this_sample = np.random.choice[arg_row_id, size=arg_n, replace=True] # gives sampled row numbers
        # Define data for this replicate:    
        X_r = arg_X[this_sample,:]
        Y_r = arg_Y[this_sample]
        # Estimate model 
        store_beta[r,:] = sm.regression.linear_model.OLS[Y_r,X_r].fit[disp=0].params
    return store_beta

In [8]:

for n in [1000,10000,100000]:
    row_id = range[0,n]
    X1 = np.random.normal[10,4,[n,1]]
    X2 = np.random.normal[10,4,[n,1]]
    X=np.append[X1,X2,1]
    X = np.append[X,np.tile[1,[n,1]],1]
    error = np.random.randn[n,1]
    Y = np.dot[X,beta].reshape[[n,1]] + error
    print "Number of observations= ",n
    %timeit python_boot[reps,row_id,n,X,Y]
    %timeit python_boot_numba[reps,row_id,n,X,Y]

Number of observations=  1000
1 loops, best of 3: 836 ms per loop
1 loops, best of 3: 841 ms per loop
Number of observations=  10000
1 loops, best of 3: 3.58 s per loop
1 loops, best of 3: 3.56 s per loop
Number of observations=  100000
1 loops, best of 3: 30.7 s per loop
1 loops, best of 3: 32.5 s per loop

Tốc độ tê [mục nhập thứ hai cho mỗi giá trị của n] thực sự rất nhỏ, chính xác như dự đoán của tài liệu của dự án numba vì chúng tôi không có mã python "gốc" [chúng tôi gọi các hàm numpy không thể biên soạn theo những cách tối ưu]. Ngoài ra, nó trông giống như thời gian chạy tỷ lệ tuyến tính.

Tiếp theo, là bản in kết quả với giá $ n = 100.000 $.

In [9]:

store_beta = python_boot[reps,row_id,100000,X,Y]
results = pd.DataFrame[store_beta,columns=['b1','b2','constant']]
results.describe[percentiles=[.01,.025,.5,.95,.975,.99]]

Out[9]:

b1b2không thay đổiđếmbần tiệnSTDTối thiểu1%2.5%50%95%97.5%99%Tối đa
1000.000000 1000.000000 1000.000000
-0.501051 0.499463 10.015594
0.000815 0.000770 0.011765
-0.503515 0.496934 9.973254
-0.502901 0.497677 9.987255
-0.502635 0.498047 9.991328
-0.501082 0.499447 10.015637
-0.499684 0.500709 10.034549
-0.499387 0.501007 10.038958
-0.499134 0.501479 10.042510
-0.498420 0.502184 10.048871

Cùng một bootstrap trong Python¶

Dưới đây là chức năng Python thực hiện từng bản sao của bootstrap. Nó lấy mẫu với sự thay thế từ dữ liệu, tính toán các ước tính OLS và lưu chúng trong một ma trận numpy.

reps, beta, n_array = 1000, [-.5,.5,10], [1000, 10000, 100000]
0

def python_boot[arg_reps,arg_row_id,arg_n,arg_X,arg_Y]:
    store_beta = np.zeros[[reps,X.shape[1]]]
    for r in range[arg_reps]:
        this_sample = np.random.choice[arg_row_id, size=arg_n, replace=True] # gives sampled row numbers
        # Define data for this replicate:    
        X_r = arg_X[this_sample,:]
        Y_r = arg_Y[this_sample]
        # Estimate model 
        store_beta[r,:] = sm.regression.linear_model.OLS[Y_r,X_r].fit[disp=0].params
    return store_beta

MATLAB sử dụng trình biên dịch đúng thời gian để dịch mã sang thực thi nhị phân máy. Điều này làm tăng đáng kể tốc độ và dường như không từ góc độ người dùng vì nó được thực hiện tự động trong nền khi một tập lệnh được chạy. Dự án Python Numba đã phát triển một trình biên dịch thời gian tương tự, với mã hóa bổ sung rất tối thiểu cần thiết. Người ta chỉ cần thêm
matlab_results = pd.DataFrame[store_beta.copy[],columns=['b1','b2','constant']]
matlab_results.describe[percentiles=[.01,.025,.5,.95,.975,.99]]
2 trước các chức năng bạn muốn biên dịch, như được hiển thị bên dưới:

Tốc độ tê [mục nhập thứ hai cho mỗi giá trị của n] thực sự rất nhỏ, chính xác như dự đoán của tài liệu của dự án numba vì chúng tôi không có mã python "gốc" [chúng tôi gọi các hàm numpy không thể biên soạn theo những cách tối ưu]. Ngoài ra, nó trông giống như thời gian chạy tỷ lệ tuyến tính.

Tiếp theo, là bản in kết quả với giá $ n = 100.000 $.

In [10]:

reps, beta, n_array = 1000, [-.5,.5,10], [1000, 10000, 100000]
2

Out[10]:

reps, beta, n_array = 1000, [-.5,.5,10], [1000, 10000, 100000]
3

Tiếp theo, chúng tôi sẽ thực hiện cùng một bootstrap trong stata.¶

  1. Điều này được chạy trong Stata 12.1 MP [2 lõi]. Phải thừa nhận rằng, đây là một phiên bản khá cũ của Stata, vì vậy có lẽ những phiên bản mới hơn nhanh hơn.
  2. Khi kích thước mẫu tăng lên, khoảng cách giữa Python và Matlab là không đổi, trong khi đối với $ N $ lớn hơn, hiệu suất của Stata so với gói giảm dần nhanh chóng.

Bởi vì chúng tôi đang dựa vào các hàm OLS "đóng hộp", so sánh ở trên có thể nắm bắt được sự không hiệu quả tương đối của các chức năng này thay vì tốc độ cơ bản của nền tảng thống kê.

So sánh bootstrapping [không có chức năng] ¶

Chúng tôi sẽ thực hiện phân tích chính xác giống như trước đây với các sửa đổi nhỏ đối với các hàm để tính toán các ước tính OLS bằng mã đại số tuyến tính cho mỗi gói [$ [x'x]^{-1} x'y $]. Vì lợi ích của sự ngắn gọn, tôi sẽ không hiển thị kết quả, mà thay vào đó chỉ tập trung vào Runtimes.

Mã MATLAB là:

In [11]:

reps, beta, n_array = 1000, [-.5,.5,10], [1000, 10000, 100000]
4

In [12]:

reps, beta, n_array = 1000, [-.5,.5,10], [1000, 10000, 100000]
5

reps, beta, n_array = 1000, [-.5,.5,10], [1000, 10000, 100000]
6

In [13]:

reps, beta, n_array = 1000, [-.5,.5,10], [1000, 10000, 100000]
7

Out[13]:

reps, beta, n_array = 1000, [-.5,.5,10], [1000, 10000, 100000]
8

Thảo luận¶

Mô hình đại số tuyến tính chạy thời gian cho cả Python và Matlab được ký hiệu là LA. Chúng tôi thêm chúng vào con số trước.

Các kết quả Python rất giống nhau, cho thấy hàm OLS StatSmodels được tối ưu hóa cao. Mặt khác, MATLAB cho thấy những cải tiến tốc độ đáng kể và chứng minh cách mã đại số tuyến tính bản địa được ưa thích cho tốc độ. Đối với ví dụ này, MATLAB nhanh hơn khoảng ba lần so với Python.

Stata đã bị loại khỏi so sánh vì thiếu hỗ trợ trong môi trường đại số tuyến tính của Stata [MATA] để lấy mẫu với sự thay thế cho $ N $ lớn.

Song song với bootstrap¶

Tất cả các kết quả trên được chạy bằng cách sử dụng các cài đặt mặc định liên quan đến đa luồng hoặc sử dụng nhiều lõi xử lý. Matlab và Stata tự động tận dụng nhiều lõi, trong khi Python thì không. So sánh sau đây tạo ra các nhóm công nhân ở cả Matlab và Python. Phiên bản hiện tại của MATLAB yêu cầu giấy phép cho hộp công cụ điện toán song song hỗ trợ 12 công nhân và để có thêm ] Một người muốn sử dụng. Để có được bất kỳ hỗ trợ đa lõi nào trong Stata, bạn phải mua phiên bản MP của chương trình.

Dưới đây là mã MATLAB bắt đầu một nhóm công nhân và chạy mã bootstrap:

In [14]:

reps, beta, n_array = 1000, [-.5,.5,10], [1000, 10000, 100000]
9

Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
0

Sau đây chạy bootstrap song song trong Python. Lưu ý, khi chuyển tham số N_JOBS cho quy trình song song, người ta không bị hạn chế một cách tùy ý do giới hạn cấp phép.

In & nbsp; [15]:

Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
1

Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
2

In [16]:

Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
3

Out[16]:

Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
4

Thảo luận

Cả Matlab và Python đều cho thấy những cải tiến đáng kể khi các bản sao bootstrap được phân phối trên nhiều lõi xử lý. Mặc dù Matlab là người nhanh nhất cho ví dụ này, hiệu suất song song của Python rất ấn tượng. Về phần trăm tăng, Python cho thấy phần trăm cải thiện tỷ lệ phần trăm lớn nhất trong thời gian chạy khi mã đại số tuyến tính được phân phối trên nhiều bộ xử lý.

Đáng chú ý là Hộp công cụ song song của Matlab được giới hạn ở 12 công nhân, trong khi ở Python không có giới hạn đối với số lượng công nhân.

Bảng đầy đủ kết quả được hiển thị dưới đây.

Out[17]:

NThời gian MatlabGiờ PythonThời gian StataPython Time [LA]Thời gian Matlab [LA]Python thời gian song songThời gian song song MATLAB012
1000 24.366323 0.836 3.445 0.309 0.163328 0.429 0.479305
10000 26.902861 3.580 10.346 2.120 0.796194 0.531 0.211717
100000 63.204921 30.700 91.113 21.700 8.114325 1.920 1.406549

Thông tin chi tiết về máy Điều này đã được chạy trên:

Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge
Send 'exit' command to kill the server
....MATLAB started and connected!
5

Matlab có nhanh hơn Python không?

Matlab nhanh hơn Python, nhưng Python tốt hơn trong việc điều hành nhiều công việc song song., but Python is better at running multiple jobs in parallel.

Matlab có tốt hơn Python không?

MATLAB có khả năng tính toán toán học rất mạnh, Python rất khó thực hiện.Python không có hỗ trợ ma trận, nhưng thư viện Numpy có thể đạt được.MATLAB đặc biệt tốt trong việc xử lý tín hiệu, xử lý hình ảnh, trong đó Python không mạnh và hiệu suất cũng tồi tệ hơn nhiều.. Python has no matrix support, but the NumPy library can be achieved. MATLAB is particularly good at signal processing, image processing, in which Python is not strong, and performance is also much worse.

Cái nào nhanh hơn hay Matlab?

Mã gần như giống nhau, nhưng hiệu suất rất khác nhau.Thời gian MATLAB mất để hoàn thành nhiệm vụ là 0,252454 giây trong khi Numpy 0,973672151566, gần gấp bốn lần.numpy 0.973672151566, that is almost four times more.

Python có nhanh hơn MATLAB để xử lý hình ảnh không?

Sử dụng các thư viện OpenCV trong Python cho các chức năng xử lý hình ảnh nhanh hơn khi so sánh với MATLAB.Điều này chủ yếu là do các thư viện OpenCV được viết bằng C/C ++ do đó chỉ là một lượng nhỏ thời gian cần thiết để thực thi mã.MATLAB được xây dựng trên rất nhiều giấy gói, tiêu tốn nhiều thời gian hơn khi mã được chạy.. This is mainly because OpenCV libraries are written in C/C++ therefore the is only a small amount time needed to execute the code. MATLAB is built on a lot of wrappers, which consumes more time when a code is run.

Bài Viết Liên Quan

Chủ Đề