2015-08-11 2 views
-3

Мне нужно пересечь список назад. Я читал о xrange() и reverse(). Какой из них дороже?reverseed() vs. xrange()

+5

'xrange' и' reverseed' делают совершенно разные вещи? – muddyfish

+1

Вы спрашиваете, следует ли использовать параметр «xrange (n, -1, -1)», зависящий от одного ошибки, или он выполняется так же быстро »(xrange (n + 1))? Согласно '% timeit', обе они одинаково быстры. –

+3

Я указываю вам документацию для ['__reversed__'] (https://docs.python.org/2/reference/datamodel.html#object.__reversed__)« Если метод '__reversed __()' не указан, 'built-in' reverse() 'будет возвращаться к использованию протокола последовательности (' __len __() 'и' __getitem __() '). Объекты, поддерживающие протокол последовательности, должны предоставлять только' __reversed __() ', если они могут обеспечить реализацию который более эффективен, чем тот, который предоставляется «reverseed()». – NightShadeQueen

ответ

2

Вы можете использовать библиотеку timeit Python для таких вещей. Вы не говорите, какой у вас список, поэтому я принимаю простой список строк. Сначала я создать список 100 элементов длиной, а затем время как:

my_list = ["hello"] * 100 

def v1(): 
    for x in my_list[::-1]: 
     pass 

def v2(): 
    for x in reversed(my_list): 
     pass 

print timeit.timeit(v1) 
print timeit.timeit(v2) 

Это дает следующий результат:

2.78170533583 
2.13084949985 

Как вы можете видеть, в этом примере reversed() немного быстрее.

+0

Не использовать, если создание списка находится внутри измерения. (В противном случае +1) – kay

+0

Действительно, хорошо заметили. –

+0

Новое в этом, довольно ясно, и geez, узнал о timeit. Благодаря! Я действительно работаю с простыми списками. И в качестве backend-реализации мне нужно было знать, какие издержки стоят меньше времени. Итак, довольно ясно. – GJntN

2

xrange() производит последовательность чисел. Вы можете использовать эти числа в качестве индексов списка, если хотите, или можете использовать их для чего-либо, где вы хотите эти числа.

for i in xrange(len(l)-1, -1, -1): 
    item = l[i] 
    print item 

reversed() производит детали из чего-то, что имеет длину и может быть проиндексированы.

for item in reversed(l): 
    print item 

Я хотел бы использовать reversed(), потому что это делает ваш код короче, проще, яснее и проще писать правильно.

+0

. Вы также можете использовать генератор 'для элемента в (l [i] для i в xrange (len (l) -1, -1, -1)): ... '. (Предостережение: может заставить других людей ненавидеть вас, когда они должны прочитать код.) – kay

+1

Действительно ... вы могли бы поставить свой генератор в функцию и называть его reversed(). :) – dsh

Смежные вопросы