Найти - Пользователи
Полная версия: Как еще можно оптимизировать следующий код?
Начало » Python для экспертов » Как еще можно оптимизировать следующий код?
1 2 3 4 5 6 7 8 9
izekia
crchemist
програма тестується на spoj.pl - там скоріше за все нема ніяких бібліотек - чистий пітон - алгоритм напевне фіговий а не бібліотеки
выше весь код написан, если алгоритм фиговый - напиши в чем
для треугольника с n строками используется n*n/2 сравнений и сложений, и я считаю это оптимальным

по поводу библиотек - буст, к примеру, там есть
crchemist
ага - алгоритм ніби нормальний - я так само колись робив на http://projecteuler.net/ Щодо оптимізації: ти спочатку зчитуєш всі дані в масив а потім рахуєш. Думаю скоріше буде зчитувати трикутник по одній лінії і ту лінію додавати одразу в результат. Плюс використовуй цикл while замість for - він мав би бути набагато швидшим. взагалі мені здається що цикл for буде набагато повільніший map - можна замість for вліпити map. Пізніше кину код
crchemist
на 10секундах на 0.5 сек швидший за твій
#!/usr/bin/env python
import sys
range_line = range(1000)
res = []

for i in range_line[:input()]:
triangle = []

for j in range_line[:input()]:
line = map(int, sys.stdin.readline().split())

if triangle:
lst_ln = triangle[-1]
line = map(lambda z:line[z] + max(lst_ln[z - 1 if z else z: z + 1]), range_line[:len(line)])
triangle.append(line)

res.append(max(triangle[-1]))

for i in res:
sys.stdout.write(str(i) + '\n')
izekia
crchemist
ага - алгоритм ніби нормальний - я так само колись робив на http://projecteuler.net/ Щодо оптимізації: ти спочатку зчитуєш всі дані в масив а потім рахуєш. Думаю скоріше буде зчитувати трикутник по одній лінії і ту лінію додавати одразу в результат. Плюс використовуй цикл while замість for - він мав би бути набагато швидшим. взагалі мені здається що цикл for буде набагато повільніший map - можна замість for вліпити map. Пізніше кину код
я не понимаю по-украински, сорри :)
izekia
crchemist
на 10секундах на 0.5 сек швидший за твій
#!/usr/bin/env python
import sys
range_line = range(1000)
res = []

for i in range_line[:input()]:
triangle = []

for j in range_line[:input()]:
line = map(int, sys.stdin.readline().split())

if triangle:
lst_ln = triangle[-1]
line = map(lambda z:line[z] + max(lst_ln[z - 1 if z else z: z + 1]), range_line[:len(line)])
triangle.append(line)

res.append(max(triangle[-1]))

for i in res:
sys.stdout.write(str(i) + '\n')
по поводу алгоритма - он немного нерабочий, так как input идет с первой строки, а не наоборот
и по поводу мапа, я делал замеры, у меня вышло что работает быстрее, чем map(f, list)

сейчас еще попробую прогнать тесты
izekia
crchemist
ага - алгоритм ніби нормальний - я так само колись робив на http://projecteuler.net/ Щодо оптимізації: ти спочатку зчитуєш всі дані в масив а потім рахуєш. Думаю скоріше буде зчитувати трикутник по одній лінії і ту лінію додавати одразу в результат. Плюс використовуй цикл while замість for - він мав би бути набагато швидшим. взагалі мені здається що цикл for буде набагато повільніший map - можна замість for вліпити map. Пізніше кину код
нашел переводчик, по поводу while, я тоже так думал, но когда сделал - разницы в результате не заметил
просто у меня на моих тестовых данных задача отрабатывается за 5.200 секунд примерно, на этой же задаче у ребят результаты меньше двух секунд, конечно может быть там инпут проще чем в моем тесте, но пока я в любом случае получаю тайм лимит
izekia
def f(x):
return x*2

def map_f(n):
map(f, range(n))

def for_f(n):
[f(x) for x in range(n)]

def main():
n = 100000
map_f(n)
for_f(n)

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

profile.run('main()', 'result.prof')
pstats.Stats('result.prof').strip_dirs().sort_stats(-1).print_stats()
на этом коде у меня стабильно время выполнения for_f меньше либо равно, то есть в целом мап медленнее получается
cybergrind
мое имхо - если настолько критично быстродействие - переписать все на С или плюсы
izekia
cybergrind
мое имхо - если настолько критично быстродействие - переписать все на С или плюсы
да на с++ уже решил эту проблему, просто мне интересно как можно было добиться такого же результата на питоне
izekia
shiza
boost - это набор сишный билиотек на все случаи жизни.

Есть для питона ускоритель. Называется Psyco (http://psyco.sourceforge.net/).
да, спасибо, я его и имел в виду, просто зачем-то буст сюда приплел :)
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