Преимущества производительности для итераторов?

был введен с / для HTML5.

Как упоминалось в документации, оба действительны. Тем не менее, предназначен только для HTML5 (и проще вводить / запоминать).

В свое время старый стиль неизбежно станет устаревшим в ближайшем будущем. Я буду придерживаться нового . Есть только один способ, но вверх. В случае с технологией это поэтапно отменяет старый (действительно, ДЕЙСТВИТЕЛЬНО быстрый)

Документация: HTML-мета-кодировка Attribute-W3Schools

20
задан kkubasik 10 March 2009 в 04:05
поделиться

7 ответов

Существует на самом деле очень хорошая почта в списке рассылки Python об этом: Итераторы по сравнению со Списками . Это немного датировано (с 2003), но насколько я знаю, это все еще допустимо.

Вот сводка:

Для небольших наборов данных, итератор и основанные на списке подходы имеют подобную производительность. Для больших наборов данных итераторы сохраняют оба времени и пространства.

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

24
ответ дан 29 November 2019 в 23:14
поделиться

Скопировать ответ @Christian Witts :

range по сравнению с xrange производительность

python25 -mtimeit "for i in xrange(1000): pass"
10000 loops, best of 3: 56.3 usec per loop

python25 -mtimeit "for i in range(1000): pass"
10000 loops, best of 3: 80.9 usec per loop

python26 -mtimeit "for i in xrange(1000): pass"
10000 loops, best of 3: 48.8 usec per loop

python26 -mtimeit "for i in range(1000): pass"
10000 loops, best of 3: 68.6 usec per loop

btw, ни range(), ни xrange() являются итераторами:

>>> hasattr(range(1), 'next')
False
>>> hasattr(xrange(1), 'next')
False
>>> iter(xrange(1))
<rangeiterator object at 0x0097A500>
>>> iter(range(1))
<listiterator object at 0x00A7BFD0>
>>> iter([])
<listiterator object at 0x00A7BE30>
>>> iter(i for i in (1,))
<generator object at 0x00A7F940>
>>> (i for i in (1,))
<generator object at 0x00A7FDC8>
3
ответ дан 29 November 2019 в 23:14
поделиться

Итераторы являются просто классами, которые реализуют конкретный интерфейс , конкретно интерфейс для движение к следующему . В Python, списках, кортежах, dicts, строках и файлах вся реализация этот интерфейс. Если они реализованы плохо, это может привести к низкой производительности, но нет ничего свойственного к интерфейсу, который подразумевает хорошую или плохую производительность.

2
ответ дан 29 November 2019 в 23:14
поделиться

Для Python генераторы будут быстрее и иметь лучшую эффективность памяти. Просто думайте о примере range(1000) по сравнению с xrange(1000) (Это было изменено в 3,0, диапазон является теперь генератором). С Диапазоном Вы предварительно создаете свой список, но XRange просто имеет объект генератора и приводит к следующему объекту при необходимости вместо этого.

различие в производительности не является большим на мелочах, но как только Вы начинаете проворачивать их, получая большие и большие наборы информации, Вы заметите его вполне быстро. Кроме того, не только имея необходимость генерировать и затем ступить через, Вы будете использовать дополнительную память для своего предварительно созданного объекта, тогда как с выражением генератора только 1 объект за один раз сделан.

12
ответ дан 29 November 2019 в 23:14
поделиться

Мой вывод из многих ответов выше: «Использовать список для кодирования. При необходимости перефакторинг с использованием итераторов» Разница Это не очевидно, если у вас нет большого набора данных.

Еще одна вещь, на которую следует обратить внимание: даже при частом использовании списков набор данных, с которым мы работаем, становится все меньше и меньше.

2
ответ дан 29 November 2019 в 23:14
поделиться

Основное преимущество итераторов не является одной из производительности. По моему опыту, самое производительное решение создает алгоритм, который встраивает Вашу предпочтительную структуру данных. Преимущество итераторов - то, что они позволяют Вам разъединять данные и алгоритм и, поэтому, делать вывод и повторное использование оба. Если это может также обойтись без (или с мало) снижение производительности тогда, это - чистая прибыль.

Мой любимый пример использования итератора может быть найден в C++ Стандартная библиотека шаблонов . Этому удается продемонстрировать питание и красоту абстракции путем чистого разделения контейнера и алгоритма, не жертвуя производительностью. Понимание этого дизайна имело сильное воздействие на способ, которым я думаю о коде.

7
ответ дан 29 November 2019 в 23:14
поделиться

Итератор является просто объектом, который предоставляет методы, чтобы позволить пересекать через набор. Вы могли пересечь все элементы массива или все узлы дерева с тем же интерфейсом. Деревья и массивы являются совсем другими структурами данных и требуют, чтобы различные методы пересекли.. но с итератором можно циклично выполниться через все элементы таким же образом.

Для одного типа набора, могут также быть различные способы пересечь его, и единственный набор мог иметь несколько итераторов.. У Вас могли быть итератор в глубину или итератор в ширину, пересекающий древовидную структуру и возвращающий узлы в различных заказах. Итераторы не предназначаются для производительности..., но обычно для обеспечения последовательного интерфейса для того, чтобы пересечь структуры.

1
ответ дан 29 November 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: