Уведомления

Группа в Telegram: @pythonsu

#1 Июль 21, 2008 12:47:45

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

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

Psyco на быстродействие данного кода не повлиял никак, по-крайней мере при использовании предложенным способом



Отредактировано (Июль 21, 2008 12:47:56)

Офлайн

#2 Июль 21, 2008 21:46:12

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

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

у меня было 6 секунд, стало 2.
Запускал понятное дело без профайлера.



Офлайн

#3 Июль 22, 2008 07:20:01

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

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

shiza
у меня было 6 секунд, стало 2.
Запускал понятное дело без профайлера.
слушай, спасибо, я не знаю почему, может из-за pyscriptera, но вчера у меня действительно не было разницы, а сегодня я запустил еще раз проверить и у меня выдало 1.484 против 5.484 без психо

Но в результате пока все-равно превышение временного лимита, пойду почитаю про психо, может есть особенности какие-то



Отредактировано (Июль 22, 2008 07:39:06)

Офлайн

#4 Июль 22, 2008 08:03:33

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

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

Весело, первое же прочитанное помогло
правда теперь вываливается какая-то ошибка, которую я пока не могу локализовать, в смысле на сфере вываливается, на моих тестах все нормально



Офлайн

#5 Июль 22, 2008 08:33:14

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

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

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



Офлайн

#6 Июль 22, 2008 08:57:53

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

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

текущий код имеет следующий вид, следующим шагом должно быть использование массива, так как аппенд связан с повторным выделением памяти, и без него я вполне могу обойтись

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()



Отредактировано (Июль 22, 2008 09:00:05)

Офлайн

#7 Июль 22, 2008 09:01:11

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

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

и вот еще такой вопрос, может быть raw_input и print не настолько оптимальны и есть более оптимальные методы ввода вывода?



Офлайн

#8 Июль 22, 2008 09:59:03

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

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

нашел где у меня проблемное место, split на вводе дает примерно 20-25% + int добавляет еще примерно 40-50%
scanf бы помог, но в официальном факе по поводу scanf сказано следующее
а на практике при добавлении регулярных выражений получил производительность в два раза хуже
в связи с чем вопрос, как оптимально обработать ввод?



Офлайн

#9 Июль 22, 2008 18:32:56

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

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

а ты компилировал регулярки?
Но у меня тоже ощущения, что они медленнее.



Отредактировано (Июль 22, 2008 18:33:47)

Офлайн

#10 Июль 22, 2008 20:36:28

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

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

shiza
а ты компилировал регулярки?
Но у меня тоже ощущения, что они медленнее.
да, конечно, компилирую сразу шаблон “(\d+)” и потом найти все делаю

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

пошел пробовать



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version