Преобразование в генератор в 3,4 раза замедляется

Что происходит? Может кто-нибудь объяснить мне, что здесь происходит, я быстро изменил :

##            j=i
##            while j < ls - 1 and len(wordlist[j]) > lc: j+=1
            j = next(j for j in range(i,ls) if len(wordlist[j]) <=  lc)

Прокомментированный , в то время как версия выполняла всю программу: 625 мс , следующая версия генератора выполняла всю программу за время 2,125 с .

В чем может быть причина того, что эта более питоническая версия вызывает такую ​​катастрофу в производительности?

РЕДАКТИРОВАТЬ: Может быть, это вызвано использованием модуля psyco ? Конечно, по крайней мере, время работы с Python 2.7, в котором нет psyco, было 2.141 для следующей версии, почти то же самое, что и Python 2.6 с psyco.

После удаления файлов * .pyc у меня не было кода для замедления. Затем, когда я удалил импорт psyco из также модуль библиотеки, у меня есть время 2.6, также для использования без psyco,результаты для версии non psyco и версии psyco (так как теперь библиотечная подпрограмма также замедляется, и время также имеет значение :)

не psyco:

  1. while: подготовка в библиотеке: 532 мс, общее время работы 2,625 с
  2. далее: подготовка в библиотеке: 532 мс, общее время работы (time.clock ()): 2,844 с (версия с xrange same wall time)

psyco:

  1. while: подготовка в библиотеке: 297 мс, общее время работы: 609..675 мс
  2. след .: подготовка в библиотеке: 297 мс, общее время работы: 1,922 с (версия с диапазоном вместо xrange везде в программе: 1,985 с)

Работа в системе WindowsXP AMD Sempron 3100+ с 2 ГБ ОЗУ. Подсчет циклов и вызовов с двумя глобальными объектами:

    j=i
    callcount += 1
    while j < ls - 1 and len(wordlist[j]) > lc:
        j+=1
        loopcount += 1

Результат для тестового ввода с помощью psyco:

Finished in 625 ms
Loopcount: 78317
Callcount: 47970
Ration: 1.633

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

ВЫВОДЫ: 000 с ( без счетчиков: 4,594 с )

  • С циклом : количество циклов: 19355114, внешнее количество: 8194033, коэффициент: 0,236, время выполнения 5,704 с ( без счетчиков: 4,688 с )
  • (время работы без цикла, счетчиков и psyco: 32,792 с, библиотека 608 мс)

    Таким образом, без дополнительных счетчиков преимущество этого цикла с использованием psyco оказывается в более тяжелом случае: (4688-4594) * 100 / 4688.0% = 2%

    Это вдохновило меня отменить другую более раннюю оптимизацию , о которой я задумался в DaniWeb. Более ранняя версия кода выполнялась быстрее , когда наименьший размер слова был глобальным , а не параметром. Согласно документации, вызовы локальных переменных выполняются быстрее, но очевидно, что затраты на утяжеление рекурсии перевешивают это. Теперь, в более сложном случае, эта другая реверсия оптимизации принесла больше ожидаемого поведения производительности в случае отсутствия оптимизации длины слова: время выполнения с psyco составило 312 мсек, всего 4 469..4 484 с время работы . Таким образом, это сделало код чище и принесло больше пользы в этом случае, чем удаленный цикл. И перевод параметра в версию с циклом while не сильно изменил время работы (разница стала больше для кода подготовки библиотеки)

    **What I learned from this: If you do n optimizations for speed 
    you must check the first n-1 optimizations after doing nth one**
    
    11
    задан Tony Veijalainen 11 October 2010 в 16:03
    поделиться