Форум сайта python.su
Как известно, для создания хорошей архитектуры вся программа разбивается на независимые блоки, которые работают друг с другом через заранее обозначенные интерфейсы. За счет этого достигается разбиение большой программы на небольшие почти независимые составляющие (зависимость появляется только за счет соответствия интерфейсам). Это заставляет делать большое количество “промежуточных” вызовов функий, которые имеют большие накладные расходы. В статических языказ подобных С++ с этим пректасно справляется компилятор, который на стадии компиляции инлайнит все вызовы (таким образом код получается простым, а программа быстрой). Как быть в динамическсих языках?
Например, у меня есть тектовый файл со строками, которые надо считать и над каждой выполнить некоторую высокоуровневую логику (определяющуюся бизнесс- идеями). Тогда стек вызовов будет таким:
1. Команда- выполнение бизнесс- логики для каждой строки (то что придумал аналитик).
2. Хранилище- прокладка, которая позволяет изменять способ хранения (база данных, файлы, интернет…), т.е. делает вызов применяемого в данный момент метода хранения данных. Далее показан стек для способа хранения в файлах.
3. Отбор- определяет набор файлов, которые необходимо прочитать (отбор по диапазону дат, контрагенту…).
4. Ридер- фактически получает данные из csv- файла.
5. Корвертер- конвертирует данные из строки в нужные типы.
Выполнение всех этих вызовов для каждой строки файла сильно замедлит выполнение программы. С другой стороны мешать все это в одну кучу тоже не хочется.
Как совместить хорошую архитектуру с хорошей производительностью?
P.s. PyPy, к сожалению, не подходит, так как требует, чтобы вся программа была написана только на Python (включая все используемые библиотеки).
Отредактировано AlekseyPythonSu (Авг. 15, 2020 10:11:20)
Офлайн
1. Основной совет очевиден, нужна производительность пишите на С++. На питоне не надо писать части критические по производительности.
2. Следствие совета 1. Частично проблему производительности можно победить векторизацией. Работайте не с со строками а с коллекциями строк. Будет больше потребление памяти, но вызов функции заменится на итерацию цикла, и многие вещи задвинутся в предварительно скомпилированные библиотеки. Например в numpy.loadtxt, sqlite pandas и т.п.
3. Измеряйте производительность. Если классический способ реализации pipeline архитектуры (А вам похоже надо это а не рекурсивные вызовы) в C++ применение ranges v2, то в питоне это применение генераторов. Используйте yield,itertools. Из общих соображений это быстрее вызовов функции с аргументами. Но надо измерять. (векторизация даст порядки а это разы скорее всего).
4. Занимайтесь оптимизацией когда это нужно. Ответьте себе на вопрос сколько времени допустимо отвести на процедуру и почему. Пишите на питоне пока не подойдет аналитик и не скажет что 5 секунд его напрягают. Тогда перепишите сразу все на C++.
Офлайн
doza_and
1. Основной совет очевиден, нужна производительность пишите на С++. На питоне не надо писать части критические по производительности.2. Следствие совета 1. Частично проблему производительности можно победить векторизацией. Работайте не с со строками а с коллекциями строк. Будет больше потребление памяти, но вызов функции заменится на итерацию цикла, и многие вещи задвинутся в предварительно скомпилированные библиотеки. Например в numpy.loadtxt, sqlite pandas и т.п. 3. Измеряйте производительность. Если классический способ реализации pipeline архитектуры (А вам похоже надо это а не рекурсивные вызовы) в C++ применение ranges v2, то в питоне это применение генераторов. Используйте yield,itertools. Из общих соображений это быстрее вызовов функции с аргументами. Но надо измерять. (векторизация даст порядки а это разы скорее всего).4. Занимайтесь оптимизацией когда это нужно. Ответьте себе на вопрос сколько времени допустимо отвести на процедуру и почему. Пишите на питоне пока не подойдет аналитик и не скажет что 5 секунд его напрягают. Тогда перепишите сразу все на C++.
Офлайн
AlekseyPythonSuИ?? О чем это замечание? Чтото не ясно в моем посте.
Пардон, но архитектура- это не часть программы,
Отредактировано doza_and (Авг. 15, 2020 11:29:13)
Офлайн
doza_and
И?? О чем это замечание? Чтото не ясно в моем посте.
Ну покороче.
Вопрос: Как создать программу в питоне с … и хорошей производительностью?
Ответ: Что такое хорошая определяется задачей. Топовая производительность - никак. Питон не предназначен для построения систем с топовой производительностью. Вы неправильно выбрали язык.
Офлайн
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 >>>
Онлайн
AlekseyPythonSuВопрос не логичен. Вы начинаете бороться за производительность, когда проблемы еще нет.
Поэтому я теперь задаю логичиный вопрос: как на Python реализовать архитектуру (и только архитектуру!)
AlekseyPythonSuЭто же не проблема, а только домыслы. Я вам и написал - измерьте производительность, если есть проблема тогда можно ее решать.
Выполнение всех этих вызовов для каждой строки файла сильно замедлит выполнение программы.
Отредактировано doza_and (Авг. 15, 2020 16:33:18)
Офлайн
doza_and
Вы начинаете бороться за производительность, когда проблемы еще нет….Я вам и написал - измерьте производительность, если есть проблема тогда можно ее решать.
Офлайн
AlekseyPythonSuА у вас есть уже реализованый проект хоть какого-нибудь размера? Дайте ссылку
Офлайн
а почему только python чем вызваны такие ограничения (под мобилку что ли или кроссплатформ?)
Офлайн