Что происходит? Может кто-нибудь объяснить мне, что здесь происходит, я быстро изменил :
## 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:
psyco:
Работа в системе 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 с )
(время работы без цикла, счетчиков и 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**