Причина, по которой это происходит, связана с компилятором JIT, который оптимизирует цикл MATLAB for. Вы можете отключить/включить ускоритель JIT с помощью feature accel off
и feature accel on
. Когда вы отключите акселератор, времена резко меняются.
MATLAB с Accel на: Elapsed time is 0.009407 seconds.
MATLAB с разгона от: Elapsed time is 0.287955 seconds.
питон: time cost = 0.0511920452118
Таким образом, JIT ускоритель непосредственно вызывает ускорение, что вы замечаете. Есть еще одна вещь, которую вы должны рассмотреть, что связано с тем, как вы определили итерационные индексы. В обоих случаях, MATLAB и python, вы использовали Итераторы для определения ваших циклов. В MATLAB вы создаете фактические значения, добавляя квадратные скобки ([]
), а в python вы используете range
вместо xrange
.Когда вы делаете эти изменения
% MATLAB
for i = [1:1000]
for j = [1:1000]
# python
for r in range(1000):
for c in range(1000):
Времена становятся
MATLAB с Accel на: Elapsed time is 0.338701 seconds.
MATLAB с Accel офф: Elapsed time is 0.289220 seconds.
питон: time cost = 0.0606048107147
Одно последнее соображение если бы вы добавили быстрый цикл в цикл. т.е. t=t+1
. Тогда времена становятся
MATLAB с Accel на: Elapsed time is 1.340830 seconds.
MATLAB с Accel выкл: Elapsed time is 0.905956 seconds.
(да прочь был быстрее)
питон: time cost = 0.147221088409
Я думаю, что мораль состоит в том, что скорости вычислений для петель, из коробки, сопоставимы для чрезвычайно простых циклов, в зависимости от ситуации. Тем не менее, в python есть другие, численные инструменты, которые могут значительно ускорить процесс, numpy и PyPy были доведены до сих пор.
Я не слишком, если есть любая разница с оптимизатором компилятора, но вы попробовали пройти вместо продолжения? Возможно, если вы добавите очень простой расчет, 't = t + 1', то он изменится. – slbass
Тестирование цикла с помощью 'python -m timeit' показывает, что использование' pass' немного медленнее, чем 'continue', но не в значительной степени. На моей машине петли занимают 16 мсек, что меньше половины того, что утверждает ОП. Также обратите внимание, что MATLAB имеет [JIT] (http://www.matlabtips.com/matlab-is-no-longer-slow-at-for-loops/), поэтому такие различия следует ожидать * особенно * с помощью простых петли. – Bakuriu
Возможно, стоит положить что-то внутри цикла, на всякий случай Matlab достаточно умен, чтобы понять, что петли фактически ничего не делают и оптимизировали их. – Aya