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 off
và feature 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.
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
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
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