Найти - Пользователи
Полная версия: Как еще можно оптимизировать следующий код?
Начало » Python для экспертов » Как еще можно оптимизировать следующий код?
1 2 3 4 5 6 7 8 9
izekia
Psyco на быстродействие данного кода не повлиял никак, по-крайней мере при использовании предложенным способом
shiza
у меня было 6 секунд, стало 2.
Запускал понятное дело без профайлера.
izekia
shiza
у меня было 6 секунд, стало 2.
Запускал понятное дело без профайлера.
слушай, спасибо, я не знаю почему, может из-за pyscriptera, но вчера у меня действительно не было разницы, а сегодня я запустил еще раз проверить и у меня выдало 1.484 против 5.484 без психо

Но в результате пока все-равно превышение временного лимита, пойду почитаю про психо, может есть особенности какие-то
izekia
Весело, первое же прочитанное помогло
правда теперь вываливается какая-то ошибка, которую я пока не могу локализовать, в смысле на сфере вываливается, на моих тестах все нормально
izekia
далее рекомендуется не использовать map и filter, если они используют функцию определенную через lambda, собственно что я и до этого делал
А вот еще интересный момент, с помощью которого еще 10% отыграл.
range, который в цикле for оптимизируется до нормального сишного for, то есть отпала необходимость в кешировании диапазона
izekia
текущий код имеет следующий вид, следующим шагом должно быть использование массива, так как аппенд связан с повторным выделением памяти, и без него я вполне могу обойтись
import psyco
psyco.full()

def main():
casesCount=input()
for caseNum in range(casesCount):
rowCount=input()
triangle=[]
for i in range(rowCount):
triangle+=[[int(x) for x in raw_input().split()]]
for i in range(rowCount - 2, -1, -1):
for j in range(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]
print rowCount == 0 and '0' or triangle[0][0]

main()
код для профилирования соответственно:
import psyco
psyco.full()

def solve():
global rc,rvrc,triangle,rowCount,results
casesCount=1000
results=[]
for caseNum in range(casesCount):
for i in range(rowCount - 2, -1, -1):
for j in range(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+=[rowCount == 0 and '0' or triangle[0][0]]
print 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

def main():
from datetime import datetime
global rc,rvrc,triangle,rowCount,results
rowCount = 100
triangle=generateT(rowCount)

t = datetime.now()
solve()
print datetime.now() - t

if __name__ == '__main__':
main()
izekia
и вот еще такой вопрос, может быть raw_input и print не настолько оптимальны и есть более оптимальные методы ввода вывода?
izekia
нашел где у меня проблемное место, split на вводе дает примерно 20-25% + int добавляет еще примерно 40-50%
scanf бы помог, но в официальном факе по поводу scanf сказано следующее
а на практике при добавлении регулярных выражений получил производительность в два раза хуже
в связи с чем вопрос, как оптимально обработать ввод?
shiza
а ты компилировал регулярки?
Но у меня тоже ощущения, что они медленнее.
izekia
shiza
а ты компилировал регулярки?
Но у меня тоже ощущения, что они медленнее.
да, конечно, компилирую сразу шаблон “(\d+)” и потом найти все делаю

я нашел в чем проблема, она в этой строке
 triangle+=[[int(x) for x in raw_input().split()]]
я вот думаю, если считать из стандартного ввода сразу весь инпут и потом его регуляркой разбить
мне кажется будет быстрее, надо попробовать :)
но остается int() который половину времени занимает …
прикольно, пока писал, родилась идея, там в треугольнике числа < 100
я могу просто делать индекс на диапазоне, вместо инта :cool:

пошел пробовать
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