Структура программы в долгоиграющем скрипте Python для обработки данных

Для моей нынешней работы я пишу несколько долгосрочных (от нескольких часов до дней) сценариев, которые выполняют интенсивную обработку данных процессором. Ход программы очень прост - он переходит в основной цикл, завершает основной цикл, сохраняет вывод и завершается: основная структура моих программ имеет тенденцию быть примерно такой:

<import statements>
<constant declarations>

<misc function declarations>

def main():
   for blah in blahs():
      <lots of local variables>
      <lots of tightly coupled computation>

      for something in somethings():
          <lots more local variables>
          <lots more computation>

   <etc., etc.>

   <save results>

if __name__ == "__main__":
    main()

Это быстро становится неуправляемым, поэтому я хочу преобразовать его в нечто более управляемое. Я хочу сделать это более понятным, не жертвуя скоростью выполнения.

Однако каждый фрагмент кода зависит от большого количества переменных, поэтому рефакторинг частей вычислений в функции может очень быстро вывести список параметров из-под контроля. Должен ли я поместить этот вид кода в класс Python и изменить локальные переменные в переменные класса? Концептуально не имеет смысла превращать программу в класс, так как класс никогда не будет использоваться повторно, и будет создан только один экземпляр для каждого экземпляра.

Какова структура наилучшей практики для такого рода программ? Я использую python, но этот вопрос относительно не зависит от языка, принимая во внимание особенности современного объектно-ориентированного языка.

3 ответа

Решение

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

Кроме того, рефакторинг (даже если он включает передачу большого количества переменных) должен помочь вам повысить скорость в долгосрочной перспективе. Профилировать приложение, которое разработано хорошо, намного проще, потому что вы можете точно определить медленные части и оптимизировать их там. Возможно, появится новая библиотека, которая оптимизирована для ваших расчетов... хорошо разработанная программа позволит вам сразу же подключить ее и протестировать. Или, возможно, вы решите написать расширение модуля C, чтобы улучшить скорость подмножества ваших вычислений, хорошо разработанное приложение также сделает это легко.

Трудно дать конкретный совет, не видя <lots of tightly coupled computation> а также <lots more computation>, Но я бы начал делать каждый for заблокировать его собственный метод и идти оттуда.

Не слишком чистый, но хорошо работает в небольших проектах...

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

Если вы сделаете это, вы захотите использовать "модуль импорта", а не "из материала импорта модуля" - он чище и будет работать лучше, если "материал" можно переназначить. Кроме того, это рекомендуется в руководствах Google.

Использование класса (или классов) может помочь вам организовать ваш код. Простота формы (например, за счет использования атрибутов и методов класса) важна, потому что она помогает вам увидеть ваш алгоритм и может помочь вам легче проводить модульное тестирование частей.

ИМО, эти преимущества намного перевешивают небольшую потерю скорости, которая может прийти с использованием ООП.

Другие вопросы по тегам