Я прохожу ссылку о генераторах, которые кто-то отправил. В начале он сравнивает две функции ниже. На его установке он показал увеличение скорости 5% с генератором.
Я выполняю Windows XP, Python 3.1.1, и, может казаться, не копирую результаты. Я продолжаю показывать "старый путь" (logs1) как являющийся немного быстрее при тестировании с обеспеченными журналами и до 1 ГБ дублированных данных.
Кто-то может помочь мне понять то, что происходит по-другому?
Спасибо!
def logs1():
wwwlog = open("big-access-log")
total = 0
for line in wwwlog:
bytestr = line.rsplit(None,1)[1]
if bytestr != '-':
total += int(bytestr)
return total
def logs2():
wwwlog = open("big-access-log")
bytecolumn = (line.rsplit(None,1)[1] for line in wwwlog)
getbytes = (int(x) for x in bytecolumn if x != '-')
return sum(getbytes)
*редактирование, располагая с интервалами испорченный в скопировать/вставить
Как бы то ни было, основная цель сравнения скорости в презентации заключалась в том, чтобы указать, что использование генераторов не приводит к огромным накладным расходам производительности. . Многие программисты, впервые увидев генераторы, могут задаться вопросом о скрытых затратах. Например, не творится ли за кулисами всякие причудливые волшебства? Может ли использование этой функции заставить мою программу работать вдвое медленнее?
В общем, это не так. Пример призван показать, что решение-генератор может работать практически с той же скоростью, если не немного быстрее в некоторых случаях (хотя это зависит от ситуации, версии Python и т. Д.). Если вы наблюдаете огромные различия в производительности между двумя версиями, то это стоит изучить.
На слайдах Дэвида Бизли, на которые вы ссылаетесь, он заявляет, что все тесты выполнялись с «Python 2.5.1 на OS X 10.4.11», а вы скажем, вы запускаете тесты с Python 3.1 в Windows XP. Итак, поймите, что вы сравниваете яблоки с апельсинами. Я подозреваю, что из двух переменных версия Python имеет гораздо большее значение.
Python 3 отличается от Python 2. Многие вещи изменились внутри (даже в ветке Python 2).Это включает оптимизацию производительности, а также снижение производительности (см., Например, недавнюю запись в блоге Бизли о вводе-выводе в Python 3 ). По этой причине на странице Советы по повышению производительности Python прямо указано:
Вы всегда должны тестировать эти советы с своим приложением и версией Python, которую вы собираетесь использовать, и не просто слепо признать, что один метод быстрее другого.
Я должен упомянуть, что одна из областей, в которой вы можете рассчитывать на помощь генераторов, - это сокращение потребления памяти , , а не процессора. Если у вас есть большой объем данных, по которым вы что-то рассчитываете или извлекаете из каждого отдельного фрагмента, и после этого вам не нужны данные, генераторы будут сиять. См. понимание генератора для более подробной информации.
У вас нет ответа почти через полчаса. Я публикую то, что имеет для меня смысл, но не обязательно правильный ответ. Я полагаю, что это лучше, чем ничего после почти получаса:
Первый алгоритм использует генератор. Генератор работает, загружая первую страницу результатов из списка (в память) и непрерывно загружая последующие страницы (в память), пока не останется ничего для чтения из ввода.
Второй алгоритм использует два генератора, каждый с оператором if
для всего двух сравнений на цикл, в отличие от одного сравнения первого алгоритма.
Также второй алгоритм вызывает функцию sum
в конце, в отличие от первого алгоритма, который просто продолжает складывать соответствующие целые числа по мере того, как он сталкивается с ними.
Таким образом, для достаточно больших входных данных второй алгоритм имеет больше сравнений и дополнительный вызов функции, чем первый. Это могло бы объяснить, почему для завершения требуется больше времени, чем для первого алгоритма.
Надеюсь, это поможет