Найти - Пользователи
Полная версия: Как еще можно оптимизировать следующий код?
Начало » Python для экспертов » Как еще можно оптимизировать следующий код?
1 2 3 4 5 6 7 8 9
izekia
Просто интересно было бы понять, где еще у меня потери.
это задача со сферы 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
shiza
Разбираться в алгоритме немного лень.
Но первое что приходит в голову, может переделать цикл и перменные rc, rvrc на итераторы?
izekia
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% и то вполне возможно, что это просто погрешность.
izekia
в общем после нескольких десятков тестов убедился что это просто погрешность + ухудшение читабельности.
Верхний цикл, кстати, в итератор не получится поместить
shiza
Может использовать Numeric -массивы?
izekia
shiza
Может использовать Numeric -массивы?
спасибо, я в принципе даже не знал что это такое, попробую использовать)
shiza
http://numpy.scipy.org/
izekia
shiza
http://numpy.scipy.org/
ага, спасибо, просто там пара товарищей эту задачу на питоне решили, на моих тестах время пока в районе 5 секунд, я вот не могу понять как догнать до двух)

boost еще может посмотреть и добавить?
shiza
boost - это набор сишный билиотек на все случаи жизни.

Есть для питона ускоритель. Называется Psyco (http://psyco.sourceforge.net/).
Он особенно хорошо циклы оптимизирует.
Ставишь. Пишешь в начале скрипта
import psyco
psyco.full()
и думаю быстрее будет в 3-4 раза.
crchemist
izekia
shiza
http://numpy.scipy.org/
ага, спасибо, просто там пара товарищей эту задачу на питоне решили, на моих тестах время пока в районе 5 секунд, я вот не могу понять как догнать до двух)

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