был введен с / для HTML5.
Как упоминалось в документации, оба действительны. Тем не менее, предназначен только для HTML5 (и проще вводить / запоминать).
В свое время старый стиль неизбежно станет устаревшим в ближайшем будущем. Я буду придерживаться нового . Есть только один способ, но вверх. В случае с технологией это поэтапно отменяет старый (действительно, ДЕЙСТВИТЕЛЬНО быстрый)
Документация: HTML-мета-кодировка Attribute-W3Schools
Существует на самом деле очень хорошая почта в списке рассылки Python об этом: Итераторы по сравнению со Списками . Это немного датировано (с 2003), но насколько я знаю, это все еще допустимо.
Вот сводка:
Для небольших наборов данных, итератор и основанные на списке подходы имеют подобную производительность. Для больших наборов данных итераторы сохраняют оба времени и пространства.
то, Что я потянул бы из него, является этим: итераторы должны быть предпочтены по загружающимся данным в список, если это возможно. Но если у Вас нет большого набора данных, не искажайте свой код для создания чего-то, что должно вписаться в список для работы с итератором.
Скопировать ответ @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>
Итераторы являются просто классами, которые реализуют конкретный интерфейс , конкретно интерфейс для движение к следующему . В Python, списках, кортежах, dicts, строках и файлах вся реализация этот интерфейс. Если они реализованы плохо, это может привести к низкой производительности, но нет ничего свойственного к интерфейсу, который подразумевает хорошую или плохую производительность.
Для Python генераторы будут быстрее и иметь лучшую эффективность памяти. Просто думайте о примере range(1000)
по сравнению с xrange(1000)
(Это было изменено в 3,0, диапазон является теперь генератором). С Диапазоном Вы предварительно создаете свой список, но XRange просто имеет объект генератора и приводит к следующему объекту при необходимости вместо этого.
различие в производительности не является большим на мелочах, но как только Вы начинаете проворачивать их, получая большие и большие наборы информации, Вы заметите его вполне быстро. Кроме того, не только имея необходимость генерировать и затем ступить через, Вы будете использовать дополнительную память для своего предварительно созданного объекта, тогда как с выражением генератора только 1 объект за один раз сделан.
Мой вывод из многих ответов выше: «Использовать список для кодирования. При необходимости перефакторинг с использованием итераторов» Разница Это не очевидно, если у вас нет большого набора данных.
Еще одна вещь, на которую следует обратить внимание: даже при частом использовании списков набор данных, с которым мы работаем, становится все меньше и меньше.
Основное преимущество итераторов не является одной из производительности. По моему опыту, самое производительное решение создает алгоритм, который встраивает Вашу предпочтительную структуру данных. Преимущество итераторов - то, что они позволяют Вам разъединять данные и алгоритм и, поэтому, делать вывод и повторное использование оба. Если это может также обойтись без (или с мало) снижение производительности тогда, это - чистая прибыль.
Мой любимый пример использования итератора может быть найден в C++ Стандартная библиотека шаблонов . Этому удается продемонстрировать питание и красоту абстракции путем чистого разделения контейнера и алгоритма, не жертвуя производительностью. Понимание этого дизайна имело сильное воздействие на способ, которым я думаю о коде.
Итератор является просто объектом, который предоставляет методы, чтобы позволить пересекать через набор. Вы могли пересечь все элементы массива или все узлы дерева с тем же интерфейсом. Деревья и массивы являются совсем другими структурами данных и требуют, чтобы различные методы пересекли.. но с итератором можно циклично выполниться через все элементы таким же образом.
Для одного типа набора, могут также быть различные способы пересечь его, и единственный набор мог иметь несколько итераторов.. У Вас могли быть итератор в глубину или итератор в ширину, пересекающий древовидную структуру и возвращающий узлы в различных заказах. Итераторы не предназначаются для производительности..., но обычно для обеспечения последовательного интерфейса для того, чтобы пересечь структуры.