Hướng dẫn is python faster than matlab? - python có nhanh hơn matlab 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

http://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,

http://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ữ.

http://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
đếm 1000.000000 1000.000000 1000.000000
bần tiện -0.500783 0.499098 10.012360
STD 0.000778 0.000803 0.011445
Tối thiểu -0.503204 0.496346 9.974214
1% -0.502515 0.497165 9.984511
2.5% -0.502226 0.497509 9.991038
50% -0.500783 0.499143 10.012116
95% -0.499493 0.500333 10.031592
97.5% -0.499266 0.500623 10.035487
99% -0.499011 0.500946 10.038212
Tối đa -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
đếm 1000.000000 1000.000000 1000.000000
bần tiện -0.501051 0.499463 10.015594
STD 0.000815 0.000770 0.011765
Tối thiểu -0.503515 0.496934 9.973254
1% -0.502901 0.497677 9.987255
2.5% -0.502635 0.498047 9.991328
50% -0.501082 0.499447 10.015637
95% -0.499684 0.500709 10.034549
97.5% -0.499387 0.501007 10.038958
99% -0.499134 0.501479 10.042510
Tối đa -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. Sản xuất những kết quả này

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

Thảo luận¶

Biểu đồ sau đây cho thấy hiệu suất của từng gói thống kê bằng cách sử dụng các hàm OLS gốc

Đã chạy bootstrap cho $ n = \ start

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 MATLAB
0 1000 24.366323 0.836 3.445 0.309 0.163328 0.429 0.479305
1 10000 26.902861 3.580 10.346 2.120 0.796194 0.531 0.211717
2 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

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

Python là một ngôn ngữ cấp cao, nó thân thiện hơn với người dùng, dễ đọc hơn và di động hơn.MATLAB là một ngôn ngữ cấp thấp và không giỏi trong một số thuật toán như tin sinh học.MATLAB có chức năng của ma trận và Python có thể sử dụng Numpy và thư viện có thể đạt được kết quả tương tự.. MATLAB is a low-level language and not good at some algorithms such as bioinformatics. MATLAB has the function of the matrix, and Python can use NumPy, and the library can achieve similar results.

Python có nhanh hơn MATLAB cho học máy không?

Python và Matlab có tốc độ tương đối tương đối, tùy thuộc vào cách bạn viết mã của mình và số lượng chức năng tích hợp bạn đang sử dụng, MATLAB có thể hoặc không nhanh hơn Python.Cả hai đều nhanh hơn R., depending on how you write your code and how many built-in functions you are using, Matlab may or may not be faster than Python. They are both faster than R.

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

Trong Python x += y;X + = y nhanh hơn x = x + y + y nhanh hơn x = x + 2*y.Tuy nhiên, trong matlab trên máy của tôi x = x + 2*y nhanh hơn một chút so với x = x + y + y.... Điểm chính xác..

Python có nhanh nhất không?

Python cực kỳ phổ biến vì nó dễ học, linh hoạt và có hàng ngàn thư viện hữu ích cho khoa học dữ liệu.Nhưng một điều nó không phải là nhanh.it is not is fast.