Найти - Пользователи
Полная версия: Повышение производительности кода на питоне
Начало » Python для экспертов » Повышение производительности кода на питоне
1 2 3
Александр Кошелев
izekia
интересные, кстати, вещи, результатов многих замеров банально не ожидал
Вы замеры времени делаете не совсем корректно. Если как описано в первом посте, то мягко говоря, результат может очень не соответствовать действительности. Посмотрите модуль timeit
evgenyl
izekia так никто не спорит, яж говорю давай ещё :)
действительно интересные вещи
izekia
Daevaorn
izekia
интересные, кстати, вещи, результатов многих замеров банально не ожидал
Вы замеры времени делаете не совсем корректно. Если как описано в первом посте, то мягко говоря, результат может очень не соответствовать действительности. Посмотрите модуль timeit
спасибо за ссылку
но
By default, timeit() temporarily turns off garbage collection during the timing. The advantage of this approach is that it makes independent timings more comparable. This disadvantage is that GC may be an important component of the performance of the function being measured. If so, GC can be re-enabled as the first statement in the setup string.
и если алгоритм функции чувствителен активности, то все же это следует обсудить отдельно, собственно спасибо за поправку.
Далее, те примеры которые я приводил - проверялись неоднократно, и время - подчеркивает разницу, то есть это был не один запуск данного кода.

Сейчас поправлю все результаты с учетом результата выдаваемого с отключенным gc
izekia
Daevaorn
спасибо за поправку, написал следующий инструмент для более правильных замеров:
from time import clock
import gc
from cStringIO import StringIO
import psyco

def getTime(f, it):
start = clock()
for i in it:
f()
end = clock()
return end - start;

def testIt(f, name, reps = 10):
gcState = gc.isenabled
gc.enable()
it = xrange(reps)
psyco.bind(f)
time1 = getTime(f, it) / reps
psyco.unbind(f)
time2 = getTime(f, it) / reps
gc.disable()
psyco.bind(f)
time3 = getTime(f, it) / reps
psyco.unbind(f)
time4 = getTime(f, it) / reps
if gcState:
gc.enable()
return '%s\t%.5f\t%.5f\t%.5f\t%.5f\tsec/repeat in %d repeats' % (name, time1, time2, time3, time4, reps)

def compareFuncs(funcList, reps = 10):
result = StringIO()
result.write('\tpsy&gc\tgc\t\tpsyco\tclean\n')
for f in funcList:
result.write(testIt(f, str(f).split()[1], reps))
result.write('\n')
result.seek(0)
return result.read()
Немного поправил, теперь это полный текст модуля для сравнения
Ferroman
Результат сильно изменился при таком замере?
izekia
Ferroman
Результат сильно изменился при таком замере?
я выше для формирования списка первые результаты поправил
можно сравнить
без использования psyco действительно для сравнения первой и последней функции результат был не совсем корректным, сказалось малое число замеров
izekia
Все, все результаты сравнений я поправил с учетом участия сборщика мусора и использования psyco
Сильно ничего не изменилось, только первый результат, о чем я написал выше.
crchemist
то всьо класно але осовна проблема в пітона з задачками - це дуже повільне зчитування і вивід даних
izekia
я как раз это и хотел замерять, и посмотреть где проблема
crchemist
можна потестити тут http://www.spoj.pl/problems/INTEST/
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB