Если вы измерите должным образом, вы увидите, что по сути нет никакой разницы (в этом примере enumerate микроскопически быстрее, чем xrange, но в пределах шума):
$ python -mtimeit -s'lst=[1,2,3,0,1,2]*1000' 'for i in xrange(len(lst)): elem=lst[i]'
1000 loops, best of 3: 480 usec per loop
$ python -mtimeit -s'lst=[1,2,3,0,1,2]*1000' 'for i, elem in enumerate(lst): pass'
1000 loops, best of 3: 473 usec per loop
(Кстати, я всегда рекомендую использовать timeit
в приглашении оболочки, как это, а не в коде или в приглашении интерпретатора, как вы делаете, просто потому, что вывод так хорошо отформатирован и удобен, с единицами измерения время и все).
В вашем коде у вас есть дополнительное назначение в случае перечисления: вы присваиваете элемент списка v в предложении заголовка for
, а затем снова присваиваете v
значение elem
; тогда как в случае с xrange вы назначаете элемент только один раз, elem
. В моем случае я также назначаю только один раз в любом случае, конечно; почему вы хотите назначить несколько раз в любом случае ?! Что бы вы ни делали с elem
и i
в теле цикла, вы можете сделать это одинаково в двух измеряемых мной формах, просто без избыточности, которую имеет ваш перечисляемый регистр.