2013-06-21 32 views
5

tôi chạy python 2.7 và MATLAB R2010a trên cùng một máy, không làm gì, và nó mang lại cho tôi 10x khác nhau về tốc độvòng lặp for trong python là 10x chậm hơn so với matlab

Tôi nhìn trực tuyến, và nghe nó phải giống nhau gọi món. Python sẽ tiếp tục chậm lại như thể toán tử tuyên bố và toán tử trong vòng lặp for

Câu hỏi của tôi: đây có phải là thực tế không? hoặc có một số cách khác để cho họ trong cùng một thứ tự tốc độ?


Đây là mã python

import time 

start_time = time.time() 

for r in xrange(1000): 

     for c in xrange(1000): 

     continue 

elapsed_time = time.time() - start_time 

print 'time cost = ',elapsed_time 

Output: time cost = 0.0377440452576

Đây là matlab đang

tic 

for i = 1:1000 

    for j = 1:1000 

    end 

end 

toc 

Output: Escaped time is 0.004200 seconds

+0

Tôi không quá nếu có bất kỳ sự khác biệt nào với trình tối ưu hóa trình biên dịch, nhưng bạn có thử vượt qua thay vì tiếp tục không? Có lẽ nếu bạn thêm một phép tính rất cơ bản, 't = t + 1' thì nó sẽ thay đổi. – slbass

+0

Kiểm tra vòng lặp với 'python -m timeit' cho thấy rằng việc sử dụng' pass' chậm hơn một chút so với 'continue', nhưng không theo một cách đáng kể. Trên máy tính của tôi các vòng mất 16 msec, đó là ít hơn một nửa những gì OP tuyên bố. Cũng lưu ý rằng MATLAB có một [JIT] (http://www.matlabtips.com/matlab-is-no-longer-slow-at-for-loops/), do đó sự khác biệt như vậy được mong đợi * đặc biệt * với đơn giản vòng lặp. – Bakuriu

+3

Có thể có giá trị đặt một cái gì đó bên trong vòng lặp, chỉ trong trường hợp Matlab là đủ thông minh để nhận ra các vòng thực sự không làm bất cứ điều gì, và đã tối ưu hóa chúng ra. – Aya

Trả lời

2

Nếu Python execut hiệu suất ion thực sự quan trọng đối với bạn, bạn có thể có một cái nhìn tại PyPy

tôi đã làm thử nghiệm của bạn:

import time 
for a in range(10): 
    start_time = time.time() 
    for r in xrange(1000): 
     for c in xrange(1000): 
      continue 

    elapsed_time = time.time()-start_time 
    print elapsed_time 

với tiêu chuẩn Python 2.7.3, tôi nhận được:

0.0311839580536 
0.0310959815979 
0.0309510231018 
0.0306520462036 
0.0302460193634 
0.0324130058289 
0.0308878421783 
0.0307397842407 
0.0304911136627 
0.0307500362396 

trong khi, sử dụng PyPy 1.9.0 (tương ứng với Python 2.7.2), tôi nhận được:

0.00921821594238 
0.0115230083466 
0.00851202011108 
0.00808095932007 
0.00496387481689 
0.00499391555786 
0.00508499145508 
0.00618195533752 
0.005126953125 
0.00482988357544 

Tăng tốc o f PyPy thực sự tuyệt vời và thực sự trở nên rõ ràng khi tối ưu hóa trình biên dịch JIT của nó lớn hơn chi phí của chúng. Đó cũng là lý do tại sao tôi giới thiệu thêm cho vòng lặp. Đối với ví dụ này, hoàn toàn không cần sửa đổi mã.

+3

Vấn đề với PyPy là nó vẫn không hỗ trợ NumPy, vì vậy nó không phải là một thay thế MATLAB lý tưởng. –

8

Lý do điều này xảy ra liên quan đến trình biên dịch JIT, tối ưu hóa MATLAB cho vòng lặp. Bạn có thể tắt/bật bộ tăng tốc JIT bằng cách sử dụng feature accel offfeature accel on. Khi bạn tắt máy gia tốc, thời gian sẽ thay đổi đáng kể.

MATLAB với Accel trên: Elapsed time is 0.009407 seconds.

MATLAB với Accel off: Elapsed time is 0.287955 seconds.

python: time cost = 0.0511920452118

Do đó, tốc JIT là trực tiếp gây ra sự tăng tốc mà bạn đang nhận thấy. Có một điều khác mà bạn nên xem xét, có liên quan đến cách bạn định nghĩa các chỉ số lặp. Trong cả hai trường hợp, MATLAB và python, bạn đã sử dụng Iterator để xác định các vòng lặp của bạn. Trong MATLAB bạn tạo các giá trị thực tế bằng cách thêm các dấu ngoặc vuông ([]), và trong trăn bạn sử dụng range thay vì xrange.Khi bạn thực hiện những thay đổi này

% MATLAB 
for i = [1:1000] 
    for j = [1:1000] 

# python 
for r in range(1000): 
    for c in range(1000): 

Giờ trở thành

MATLAB với Accel trên: Elapsed time is 0.338701 seconds.

MATLAB với Accel off: Elapsed time is 0.289220 seconds.

python: time cost = 0.0606048107147

Một xem xét cuối cùng là nếu bạn đã thêm tính toán nhanh vào vòng lặp. tức là t=t+1. Sau đó, lần trở

MATLAB với Accel trên: Elapsed time is 1.340830 seconds.

MATLAB với Accel off: Elapsed time is 0.905956 seconds. (Có tắt là nhanh hơn)

python: time cost = 0.147221088409

Tôi nghĩ rằng đạo đức ở đây là tốc độ tính toán của các vòng, ngoài hộp, có thể so sánh được với các vòng cực kỳ đơn giản, tùy thuộc vào tình huống. Tuy nhiên, có những công cụ khác, số trong python có thể tăng tốc độ đáng kể, numpy và PyPy đã được đưa ra cho đến nay.

+0

'xrange' của Python là một trình lặp đơn giản. Nếu bạn muốn so sánh phiên bản MATLAB với phiên bản của python, bạn nên sử dụng 'dải ô' đơn giản. – Bakuriu

+0

@ Bakuriu Bạn nói đúng, tôi đã thay đổi bài đăng của mình để sử dụng phạm vi và cập nhật thời gian chạy, mặc dù không có gì thực sự thay đổi. – slbass

+0

Bạn nhận được kết quả gì nếu bạn so sánh các khối mã giống nhau, nhưng sử dụng 'for i = 1: 1000' của Matlab so với' xrange' của Matlab? – Aya

3

Việc triển khai Python cơ bản, CPython, không có nghĩa là siêu nhanh. Nếu bạn cần thao tác số hiệu matlab hiệu quả, hãy sử dụng the numpy package hoặc triển khai Python được thiết kế để hoạt động nhanh, chẳng hạn như PyPy hoặc thậm chí là Cython. (Viết một phần mở rộng Python trong C, mà tất nhiên sẽ khá nhanh, cũng là một giải pháp có thể, nhưng trong trường hợp đó bạn cũng có thể chỉ sử dụng numpy và tiết kiệm cho mình những nỗ lực.)