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

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

<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 ]

2 голосов
/ 27 мая 2010

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

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

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

2 голосов
/ 27 мая 2010

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

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

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

1 голос
/ 27 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...