Структура программ в длительной работе обработки данных Python Script

StackOverflow https://stackoverflow.com/questions/2921368

Вопрос

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

<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 и изменить локальные переменные в классные переменные? Это не имеет большого смысла TP мне концептуально, чтобы превратить программу в класс, так как класс никогда не будет повторно использован, и только один экземпляр когда-либо будет создан на случай.

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top