Форум сайта python.su
Просто интересно было бы понять, где еще у меня потери.
это задача со сферы 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)
Офлайн
Разбираться в алгоритме немного лень.
Но первое что приходит в голову, может переделать цикл и перменные rc, rvrc на итераторы?
Офлайн
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]]
Офлайн
в общем после нескольких десятков тестов убедился что это просто погрешность + ухудшение читабельности.
Верхний цикл, кстати, в итератор не получится поместить
Офлайн
Может использовать Numeric -массивы?
Офлайн
shizaспасибо, я в принципе даже не знал что это такое, попробую использовать)
Может использовать Numeric -массивы?
Офлайн
Офлайн
shizaага, спасибо, просто там пара товарищей эту задачу на питоне решили, на моих тестах время пока в районе 5 секунд, я вот не могу понять как догнать до двух)
http://numpy.scipy.org/
Офлайн
boost - это набор сишный билиотек на все случаи жизни.
Есть для питона ускоритель. Называется Psyco (http://psyco.sourceforge.net/).
Он особенно хорошо циклы оптимизирует.
Ставишь. Пишешь в начале скрипта
import psyco
psyco.full()
Отредактировано (Июль 19, 2008 23:46:58)
Офлайн
izekiaпрограма тестується на spoj.pl - там скоріше за все нема ніяких бібліотек - чистий пітон - алгоритм напевне фіговий а не бібліотекиshizaага, спасибо, просто там пара товарищей эту задачу на питоне решили, на моих тестах время пока в районе 5 секунд, я вот не могу понять как догнать до двух)
http://numpy.scipy.org/
boost еще может посмотреть и добавить?
Офлайн