Скорость генератора в python 3

Я прохожу ссылку о генераторах, которые кто-то отправил. В начале он сравнивает две функции ниже. На его установке он показал увеличение скорости 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)

*редактирование, располагая с интервалами испорченный в скопировать/вставить

8
задан agf 28 September 2011 в 18:11
поделиться

3 ответа

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

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

9
ответ дан 5 December 2019 в 17:36
поделиться

На слайдах Дэвида Бизли, на которые вы ссылаетесь, он заявляет, что все тесты выполнялись с «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, которую вы собираетесь использовать, и не просто слепо признать, что один метод быстрее другого.

Я должен упомянуть, что одна из областей, в которой вы можете рассчитывать на помощь генераторов, - это сокращение потребления памяти , , а не процессора. Если у вас есть большой объем данных, по которым вы что-то рассчитываете или извлекаете из каждого отдельного фрагмента, и после этого вам не нужны данные, генераторы будут сиять. См. понимание генератора для более подробной информации.

1
ответ дан 5 December 2019 в 17:36
поделиться

У вас нет ответа почти через полчаса. Я публикую то, что имеет для меня смысл, но не обязательно правильный ответ. Я полагаю, что это лучше, чем ничего после почти получаса:

Первый алгоритм использует генератор. Генератор работает, загружая первую страницу результатов из списка (в память) и непрерывно загружая последующие страницы (в память), пока не останется ничего для чтения из ввода.

Второй алгоритм использует два генератора, каждый с оператором if для всего двух сравнений на цикл, в отличие от одного сравнения первого алгоритма.

Также второй алгоритм вызывает функцию sum в конце, в отличие от первого алгоритма, который просто продолжает складывать соответствующие целые числа по мере того, как он сталкивается с ними.

Таким образом, для достаточно больших входных данных второй алгоритм имеет больше сравнений и дополнительный вызов функции, чем первый. Это могло бы объяснить, почему для завершения требуется больше времени, чем для первого алгоритма.

Надеюсь, это поможет

0
ответ дан 5 December 2019 в 17:36
поделиться
Другие вопросы по тегам:

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