Найти - Пользователи
Полная версия: Как на Python создать программу с хорошей архитектурой и производительностью?
Начало » Python для экспертов » Как на Python создать программу с хорошей архитектурой и производительностью?
1 2
AlekseyPythonSu
Как известно, для создания хорошей архитектуры вся программа разбивается на независимые блоки, которые работают друг с другом через заранее обозначенные интерфейсы. За счет этого достигается разбиение большой программы на небольшие почти независимые составляющие (зависимость появляется только за счет соответствия интерфейсам). Это заставляет делать большое количество “промежуточных” вызовов функий, которые имеют большие накладные расходы. В статических языказ подобных С++ с этим пректасно справляется компилятор, который на стадии компиляции инлайнит все вызовы (таким образом код получается простым, а программа быстрой). Как быть в динамическсих языках?

Например, у меня есть тектовый файл со строками, которые надо считать и над каждой выполнить некоторую высокоуровневую логику (определяющуюся бизнесс- идеями). Тогда стек вызовов будет таким:
1. Команда- выполнение бизнесс- логики для каждой строки (то что придумал аналитик).
2. Хранилище- прокладка, которая позволяет изменять способ хранения (база данных, файлы, интернет…), т.е. делает вызов применяемого в данный момент метода хранения данных. Далее показан стек для способа хранения в файлах.
3. Отбор- определяет набор файлов, которые необходимо прочитать (отбор по диапазону дат, контрагенту…).
4. Ридер- фактически получает данные из csv- файла.
5. Корвертер- конвертирует данные из строки в нужные типы.

Выполнение всех этих вызовов для каждой строки файла сильно замедлит выполнение программы. С другой стороны мешать все это в одну кучу тоже не хочется.

Как совместить хорошую архитектуру с хорошей производительностью?

P.s. PyPy, к сожалению, не подходит, так как требует, чтобы вся программа была написана только на Python (включая все используемые библиотеки).
doza_and
1. Основной совет очевиден, нужна производительность пишите на С++. На питоне не надо писать части критические по производительности.
2. Следствие совета 1. Частично проблему производительности можно победить векторизацией. Работайте не с со строками а с коллекциями строк. Будет больше потребление памяти, но вызов функции заменится на итерацию цикла, и многие вещи задвинутся в предварительно скомпилированные библиотеки. Например в numpy.loadtxt, sqlite pandas и т.п.
3. Измеряйте производительность. Если классический способ реализации pipeline архитектуры (А вам похоже надо это а не рекурсивные вызовы) в C++ применение ranges v2, то в питоне это применение генераторов. Используйте yield,itertools. Из общих соображений это быстрее вызовов функции с аргументами. Но надо измерять. (векторизация даст порядки а это разы скорее всего).
4. Занимайтесь оптимизацией когда это нужно. Ответьте себе на вопрос сколько времени допустимо отвести на процедуру и почему. Пишите на питоне пока не подойдет аналитик и не скажет что 5 секунд его напрягают. Тогда перепишите сразу все на C++.
AlekseyPythonSu
doza_and
1. Основной совет очевиден, нужна производительность пишите на С++. На питоне не надо писать части критические по производительности.2. Следствие совета 1. Частично проблему производительности можно победить векторизацией. Работайте не с со строками а с коллекциями строк. Будет больше потребление памяти, но вызов функции заменится на итерацию цикла, и многие вещи задвинутся в предварительно скомпилированные библиотеки. Например в numpy.loadtxt, sqlite pandas и т.п. 3. Измеряйте производительность. Если классический способ реализации pipeline архитектуры (А вам похоже надо это а не рекурсивные вызовы) в C++ применение ranges v2, то в питоне это применение генераторов. Используйте yield,itertools. Из общих соображений это быстрее вызовов функции с аргументами. Но надо измерять. (векторизация даст порядки а это разы скорее всего).4. Занимайтесь оптимизацией когда это нужно. Ответьте себе на вопрос сколько времени допустимо отвести на процедуру и почему. Пишите на питоне пока не подойдет аналитик и не скажет что 5 секунд его напрягают. Тогда перепишите сразу все на C++.

Пардон, но архитектура- это не часть программы, которая критична по производительности. Это скорее подход создания программы.
doza_and
AlekseyPythonSu
Пардон, но архитектура- это не часть программы,
И?? О чем это замечание? Чтото не ясно в моем посте.

Ну покороче.
Вопрос: Как создать программу в питоне с … и хорошей производительностью?
Ответ: Что такое хорошая определяется задачей. Топовая производительность - никак. Питон не предназначен для построения систем с топовой производительностью. Вы неправильно выбрали язык.

p.s.
Если вы не пишете абсолютную чушь, то архитектура ну в 2-3 раза изменит скорость.
Другие алгоритмы или переход на компилируемые языки изменит производительность в 100 раз или более. Не парьтесь пишите так чтобы вам было понятно. В вашем случае уместны генераторы.
AlekseyPythonSu
doza_and
И?? О чем это замечание? Чтото не ясно в моем посте.

Ну покороче.
Вопрос: Как создать программу в питоне с … и хорошей производительностью?
Ответ: Что такое хорошая определяется задачей. Топовая производительность - никак. Питон не предназначен для построения систем с топовой производительностью. Вы неправильно выбрали язык.

В сотнях книг написано, что Python хорош в качестве высокоуровнего “клея”, который опишет структуру программы (а конкретные компоненты можно реализовать на быстром С). Поэтому я теперь задаю логичиный вопрос: как на Python реализовать архитектуру (и только архитектуру!), т.е. реализовать то, что написано в сотнях книг.
py.user.next
AlekseyPythonSu
Например, у меня есть тектовый файл со строками, которые надо считать и над каждой выполнить некоторую высокоуровневую логику (определяющуюся бизнесс- идеями). Тогда стек вызовов будет таким:
1. Команда- выполнение бизнесс- логики для каждой строки (то что придумал аналитик).
2. Хранилище- прокладка, которая позволяет изменять способ хранения (база данных, файлы, интернет…), т.е. делает вызов применяемого в данный момент метода хранения данных. Далее показан стек для способа хранения в файлах.
3. Отбор- определяет набор файлов, которые необходимо прочитать (отбор по диапазону дат, контрагенту…).
4. Ридер- фактически получает данные из csv- файла.
5. Корвертер- конвертирует данные из строки в нужные типы.

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

Используешь ли ты генераторы?

Например, сколько времени уйдёт на работу этого кода, выводящего миллион чисел на экран? Сначала прикинь теоретически, потом проверь на практике.
  
>>> def gen(seq):
...     while True:
...         for i in seq:
...             yield i
... 
>>> g = gen((1, 2, 3, 4, 5))
>>> for i, _ in zip(g, range(1000000)):
...     print('\r' + str(i), end=' ')
... 
5 >>>
doza_and
AlekseyPythonSu
Поэтому я теперь задаю логичиный вопрос: как на Python реализовать архитектуру (и только архитектуру!)
Вопрос не логичен. Вы начинаете бороться за производительность, когда проблемы еще нет.
AlekseyPythonSu
Выполнение всех этих вызовов для каждой строки файла сильно замедлит выполнение программы.
Это же не проблема, а только домыслы. Я вам и написал - измерьте производительность, если есть проблема тогда можно ее решать.
Когда вы говорите об архитектуре это не совсем понятно что именно вам надо.
https://ru.wikipedia.org/wiki/%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F
“Общепринятого определения «архитектуры программного обеспечения» не существует.”

Также очевидно что красивая “архитектура” и производительность антогонисты. Либо одно либо другое. Какой компромисс вас устроит вам решать.
AlekseyPythonSu
doza_and
Вы начинаете бороться за производительность, когда проблемы еще нет….Я вам и написал - измерьте производительность, если есть проблема тогда можно ее решать.

Нам дан разум, чтобы мы могли предвидеть будущие события. Этим мы отличаемся от животных.
Какой смысл писать проект длиной в полгода, чтобы потом понять: вызовы процедур полностью сожрали производительность?

FishHook
AlekseyPythonSu
А у вас есть уже реализованый проект хоть какого-нибудь размера? Дайте ссылку
AD0DE412
а почему только python чем вызваны такие ограничения (под мобилку что ли или кроссплатформ?)
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