Найти - Пользователи
Полная версия: СРОЧНО помогите пожалуйста с оптимизацией кода
Начало » Python для экспертов » СРОЧНО помогите пожалуйста с оптимизацией кода
1 2
Rjugo
Доброго времени суток, уважаемые форумчане, несколько дней мучался над программой, сейчас она работает на на 0,015 секунды дольше чем должна, голова уже не варит от слова совсем, так что нужна помощь знающих людей, пожалуйста, прооптимизируйте мой горе код на сколько это возможно, я буду крайне Вам признателен

за ранее ОГРОМНОЕ СПАСИБО!
Задача с Timus 1287 “Каналы на марсе” (СМ прикрепленный файл)


Один из районов поверхности Марса покрыт идеальной сеткой каналов. Они делят поверхность на одинаковые квадратные клетки (кривизной поверхности мы здесь пренебрегаем). Сам район представляет собой идеальный квадрат, каждая сторона которого разбита на N клеток.
Как показали исследования археологической экспедиции, покрытый каналами район Марса занимала древняя страна под названием Йатик. Жители Йатика выращивали специальный злак — сир — который составлял основу их метаболизма. Сир бывает двух сортов — крупно- и мелкозернистый. Собственно, закат империи Йатика начался после гражданской войны между любителями этих сортов. До последнего времени, однако, не было установлено, какая из партий победила в этой кровопролитной войне. Результаты последней экспедиции на Марс позволяют надеяться на разгадку этой исторической тайны. Ученым удалось установить, сир какого сорта был последним высеян в той или иной клетке Йатика. Поскольку, по стародавней традиции, сир высевали в последовательности клеток (параллельные сторонам света, или идущие под углом 45° к ним), можно предположить, что сторонники победившей партии делали наиболее длинные посевы.
Исходные данные
В первой строке входа содержится единственное число N — размер квадрата (1 ≤ N ≤ 1400). Затем следуют N строк, каждая из которых состоит ровно из N символов. Буква “s” в i-й строке и j-м столбце означает, что в соответствующей клетке квадрата последним был высеян мелкозернистый сир, буква “S” означает, что последним был высеян крупнозернистый сир. Можно считать, что жители данного района не выращивали ничего кроме сира, и в каждой клетке района был засеян сир одного из этих двух сортов.
Результат
В первую строку нужно записать символ “s”, если в кровопролитной войне победила партия любитетей мелкозернистого сира, и символ “S”, если крупнозернистого. Если победителя определить невозможно, то первая строка должна содержать единственный символ “?”. Во второй строке должно быть записано целое число — максимальная длина посева сира одного сорта.
FishHook
Rjugo
Ваш код не может работать вообще никак потому что в строкaх 124, 135 и 143 у вас return вне всякой функции. Тот удивительный факт, что ваша программа не завершается с исключением, говорит о том, что ваша программа никогда не доходит до этих строк, а еще это говорит о том, что вы не тестировали все юз-кейсы своей программы. Что вам сейчас нужно сделать:
1. декомпозировать
на этом этапе ваша программа должна состоять из набора коротких (не более десяти строк) функций. Каждая функция выполняет одно и только одно элементарное действие и не зависит от некоего глобального состояния

 Нет!
 def scm(mat,lt):  # ФУНКЦИЯ, которая находит самые длинные неприрывные цепочки (среди строк передаваемой в качестве матрицы) из букв, возвращет букву, из которой состоит саммая длинная цепочка и колличесвто этой буквы в цепочке или знак "?" если в строчке равное колличесвто букв S и s (второй аргумент всегда 0, углубляться почему это так не буду)

 Да!
 def longest_line(matrix):  # ФУНКЦИЯ, которая находит самые длинные неприрывные цепочки 
  
def line_letter(line): # возвращет букву, из которой состоит цепочка
  
def letters_count(line, letter) # возвращет колличесвто буквы в цепочке или знак "?" если в строчке равное колличесвто букв S и s

2. весь код поместить в функции, в глобальной область должен быть только один вызов
 def ..
  
def ..
  
def main():
   ..
  
if __name__ == "__main__":
     main()

3. протестировать
каждую функцию вы должны протестировать отдельно. Если функции элементарны, то и тестировать их можно элементарно

 то есть если у нас есть функция, которая выбирает самую длинную строку из списка строк, например

   
def longest_line(list_of_lines):
    line = None 
    max_len = 0
        for l in list_of_lines:
           if len(l) > max_len:
              line = l
              max_len = len(l)
    return line

 то для этой функции вы можете написать несколько проверочных вызовов, например

 assert longest_line(["aaa", "bbbbbb", "", "aa"]) == "bbbbbb"

сейчас же с вашим кодом ничего сделать нельзя, потому что он просто не работает как вы задумывали, а вы об этом и не знаете. Тут о скорости выполнения еще очень рано задумываться даже
work2crowd
Хорошее объяснение, вывод нужно всё перепроверять по отдельным частям
nassl
FishHook
 def longest_line(list_of_lines):
    line = None 
    max_len = 0
        for l in list_of_lines:
           if len(l) > max_len:
              line = l
              max_len = len(l)
    return line

Понятно, что некропост, но так не проще? (я не настоящий программист, если что)
 def longest_line(list_of_lines):
	return sorted(list_of_lines)[-1]
py.user.next
nassl
FishHook
  
     def longest_line(list_of_lines):
        line = None 
        max_len = 0
            for l in list_of_lines:
               if len(l) > max_len:
                  line = l
                  max_len = len(l)
        return line

Понятно, что некропост, но так не проще? (я не настоящий программист, если что)

  
def longest_line(list_of_lines):
	return sorted(list_of_lines)[-1]
Вот так можно
  
>>> lst = ['a', 'bbb', 'cc']
>>> max(lst, key=len)
'bbb'
>>>
И FishHook знал это.

Просто у нас тут тематика другая. Главное, не что написано, а как решено. У FishHook'а более прочный вариант, так как он кроссязыковый. Не во всех языках программирования есть функция max(), которая может так выделить длинную строку. Но во всех языках сработает вариант с циклом.

nassl
но так не проще? (я не настоящий программист, если что)
Да это и так видно. Если ты не замечаешь, что там будут лишние сравнения символов в парах строк, которые не нужны для определения длин строк вообще, то это не просто такая случайная слепота, а это новичковая неспособность представить написанную строку кода в виде развёрнутого алгоритма, который скрывается за этой строкой. Так вот это мышление в виде развёрнутых алгоритмов во всём развивается через написание вот таких длинных кодов с циклами и со всеми остальными базовыми конструкциями. Это алгоритмическим мышлением называется. Ты смотришь на строку и видишь за ней весь код всех инструкций, которые в ней выполняются, когда эта строка выполняется. Так ты замечаешь, что внутри этой строки кода выполняются ненужные сравнения символов. И при миллионе строк в списке эти ненужные сравнения символов будут выполняться миллионы раз.

У FishHook'а там только один косяк: у него длина текущей строки вычисляется сначала один раз, а потом вычисляется точно так же второй раз, хотя первый раз уже произошёл и длина строки к этому времени уже известна.
nassl
py.user.next
Просто у нас тут тематика другая.
понятно, что sort много лишнего делает. про max(..) c аргументом key - прикольно.
но если речь про миллионы строк, то numpy или чистый си, питон - это вроде не про скорость.
py.user.next
nassl
но если речь про миллионы строк, то numpy или чистый си, питон - это вроде не про скорость.
Функция sorted() на C реализована. Когда она сортирует, эту сортировку проводит скомпилированный сишный код. Просто не знаешь ничего про питон.
nassl
py.user.next
. Просто не знаешь ничего про питон.
Более того, я даже ни одной книжки по питону не читал. У меня другая профессия.
Так, что возьми с полки пирожок и почувствуй себя умным
py.user.next
nassl
Более того, я даже ни одной книжки по питону не читал. У меня другая профессия.
В программировании нельзя что-то изобразить. Ты либо можешь, либо не можешь. Можешь написать программу - ты программист. Не можешь написать программу - ты не программист. Третьего не дано. А прийти и рассказывать, как ты там что-то читал или не читал, это всё всем побоку.
nassl
что мне подсказывает, что пирожок тебе не дали
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