Что "лучше" обратный метод или обратная встроенная функция? - PullRequest
12 голосов
/ 25 июля 2011

Что обычно считается более Pythonic / лучше / быстрее в использовании, обратный метод или обратная встроенная функция?

Оба в действии:

_list = list(xrange(4))

print _list

rlist = list(reversed(_list))

print rlist

_list.reverse()

print _list

Ответы [ 4 ]

30 голосов
/ 25 июля 2011

foo.reverse() фактически инвертирует элементы в контейнере. reversed() на самом деле ничего не меняет, он просто возвращает объект, который можно использовать для перебора элементов контейнера в обратном порядке. Если это то, что вам нужно, это часто быстрее, чем реверсирование элементов.

10 голосов
/ 25 июля 2011

Кажется, есть большая разница.Я действительно думал, что это наоборот.Почему перестановка значений в списке быстрее, чем создание нового из итератора?

from decorators import bench

_list = range(10 ** 6)

@ bench
def foo():
  list(reversed(_list))

@ bench
def bar():
  _list.reverse()

foo()
bar()

print foo.time
print bar.time

0.1672780513760,0122621059418

9 голосов
/ 25 июля 2011

Зависит от того, хотите ли вы изменить список на месте (т.е. изменить список) или нет.Никакой другой реальной разницы.

Часто использование reversed приводит к более хорошему коду.

3 голосов
/ 25 июля 2011

Не зная реальной статистики о производительности, _list.reverse() изменяет сам список, тогда как reversed(_list) возвращает итератор, готовый пройти по списку в обратном порядке.Это большая разница сама по себе.

Если это не проблема, object.reverse() кажется мне более читабельным, но, возможно, у вас есть определенные требования к скорости.И если reverse() не принадлежит 80% программного обеспечения, которое потребляет ресурсы, я бы не стал беспокоиться (как правило).

...