Уведомления

Группа в Telegram: @pythonsu

#1 Июль 19, 2008 07:54:14

izekia
От:
Зарегистрирован: 2008-07-19
Сообщения: 317
Репутация: +  12  -
Профиль   Отправить e-mail  

Как еще можно оптимизировать следующий код?

Просто интересно было бы понять, где еще у меня потери.
это задача со сферы SUMTRIAN

def main():
global rc,rvrc,triangle,rowCount,results
casesCount=100
results=[]
rc = range(500000)
rvrc = rc[:]
rvrc.reverse()
for caseNum in rc[:casesCount]:
if rowCount>0:
for i in rvrc[1-rowCount:]:
for j in rc[:i+1]:
triangle[i][j] += triangle[i+1][j] > triangle[i+1][j+1] and triangle[i+1][j] or triangle[i+1][j+1]
results+=[triangle[0][0]]
else:
results+=[0]
for i in results:
None#print i

# profile
def generateT(n):
t=[]
for i in range(n):
t.append(range(1, i+2))
return t


if __name__ == '__main__':
import profile, pstats

rowCount = 100
triangle=generateT(rowCount)
profile.run('main()', 'result.prof')
pstats.Stats('result.prof').strip_dirs().sort_stats(-1).print_stats()
код без профилирования:
casesCount=input()
results=[]
rc = range(500000)
rvrc = rc[:]
rvrc.reverse()
for caseNum in rc[:casesCount]:
rowCount=input()
triangle=[]
for i in rc[:rowCount]:
triangle+=[map(int,raw_input().split())]
if rowCount>0:
for i in rvrc[1-rowCount:]:
for j in rc[:i+1]:
triangle[i][j]+= triangle[i+1][j] > triangle[i+1][j+1] and triangle[i+1][j] or triangle[i+1][j+1]
results+=[triangle[0][0]]
else:
results += [0]
for i in results:
print i



Отредактировано (Июль 19, 2008 08:06:16)

Офлайн

#2 Июль 19, 2008 13:18:17

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Как еще можно оптимизировать следующий код?

Разбираться в алгоритме немного лень.
Но первое что приходит в голову, может переделать цикл и перменные rc, rvrc на итераторы?



Офлайн

#3 Июль 19, 2008 13:26:06

izekia
От:
Зарегистрирован: 2008-07-19
Сообщения: 317
Репутация: +  12  -
Профиль   Отправить e-mail  

Как еще можно оптимизировать следующий код?

shiza
Разбираться в алгоритме немного лень.
Но первое что приходит в голову, может переделать цикл и переменные rc, rvrc на итераторы?
Основная трата времени здесь:
        for i in rvrc[1-rowCount:]:
for j in rc[:i+1]:
triangle[i][j]+= triangle[i+1][j] > triangle[i+1][j+1] and triangle[i+1][j] or triangle[i+1][j+1]
это можно написать так:
			for i in rvrc[1-rowCount:]:
triangle[i] = [triangle[i][j] + (triangle[i+1][j] > triangle[i+1][j+1] and triangle[i+1][j] or triangle[i+1][j+1]) for j in rc[:i+1]]
выигрыш примерно 1% и то вполне возможно, что это просто погрешность.



Офлайн

#4 Июль 19, 2008 13:28:17

izekia
От:
Зарегистрирован: 2008-07-19
Сообщения: 317
Репутация: +  12  -
Профиль   Отправить e-mail  

Как еще можно оптимизировать следующий код?

в общем после нескольких десятков тестов убедился что это просто погрешность + ухудшение читабельности.
Верхний цикл, кстати, в итератор не получится поместить



Офлайн

#5 Июль 19, 2008 13:29:06

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Как еще можно оптимизировать следующий код?

Может использовать Numeric -массивы?



Офлайн

#6 Июль 19, 2008 13:35:55

izekia
От:
Зарегистрирован: 2008-07-19
Сообщения: 317
Репутация: +  12  -
Профиль   Отправить e-mail  

Как еще можно оптимизировать следующий код?

shiza
Может использовать Numeric -массивы?
спасибо, я в принципе даже не знал что это такое, попробую использовать)



Офлайн

#7 Июль 19, 2008 13:53:33

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Как еще можно оптимизировать следующий код?

Офлайн

#8 Июль 19, 2008 20:08:37

izekia
От:
Зарегистрирован: 2008-07-19
Сообщения: 317
Репутация: +  12  -
Профиль   Отправить e-mail  

Как еще можно оптимизировать следующий код?

shiza
http://numpy.scipy.org/
ага, спасибо, просто там пара товарищей эту задачу на питоне решили, на моих тестах время пока в районе 5 секунд, я вот не могу понять как догнать до двух)

boost еще может посмотреть и добавить?



Офлайн

#9 Июль 19, 2008 22:57:28

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Как еще можно оптимизировать следующий код?

boost - это набор сишный билиотек на все случаи жизни.

Есть для питона ускоритель. Называется Psyco (http://psyco.sourceforge.net/).
Он особенно хорошо циклы оптимизирует.
Ставишь. Пишешь в начале скрипта

import psyco
psyco.full()
и думаю быстрее будет в 3-4 раза.



Отредактировано (Июль 19, 2008 23:46:58)

Офлайн

#10 Июль 19, 2008 23:04:12

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

Как еще можно оптимизировать следующий код?

izekia
shiza
http://numpy.scipy.org/
ага, спасибо, просто там пара товарищей эту задачу на питоне решили, на моих тестах время пока в районе 5 секунд, я вот не могу понять как догнать до двух)

boost еще может посмотреть и добавить?
програма тестується на spoj.pl - там скоріше за все нема ніяких бібліотек - чистий пітон - алгоритм напевне фіговий а не бібліотеки



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version