Анон, вместо того, чтобы без разметки постить код, лучше шарь его через специальные ресурсы: https://ideone.com/ - возможность постить листинги кода и онлайн-запуска, не требует регистрации https://dumpz.org/ - можно постить листинги, не требует регистрации https://pastebin.com/ - для листингов, регистрация не обязательна https://www.codepile.net/ - можно расшарить код в том числе на редактирование, особая полезная опция - чат при каждом листинге, где можно код обсудить https://pyfiddle.io/ - запуск python кода онлайн, но чтобы шарить, надо регистрироваться
Вопросы-ответы: — А стоит ли читать Лутца, том номер N? Мнения в треде разделены. Кто-то за (очень неплохая база даётся), кто-то против (слишком много воды и объём книг убивает всё рвение). В общем — решать тебе, книга вредна не будет, но ты можешь её просто не дочитать и забросить.
— Стоит ли читать %книга_нейм%, если там питон версии 2.х? Нет, не стоит. 100% есть более актуальная книга, для пистона 3.х
— А что ещё можно читать? Питон сам по себе очень хорошо задокументирован и для уровня начинающих, и для продвинутого. Смотри официальную документацию. Можно начать вот с этого https://docs.python.org/3/tutorial/introduction.html
— Что можно почитать/посмотреть по многопоточности/параллелизации в питоне, да и вообще в целом? Очень годный ролик на американском языке про многопоточность и асинхронность https://www.youtube.com/watch?v=MCs5OvhV9S4
— А как учить джангу? Нахожу только книги по джанге 1.х У джанги отличные доки (одни из лучших для пистоновских либ, имхо), почитай их для начала. Книгу по джанге можно читать и для версий <2, это не проблема, т.к. принципы остаются теми же. Для переката на 2.х хватит changelog`a или тех же самых доков/статей. Начни изучать с разбора учебного приложения с голосовалкой из официальной документации.
— В ньюфаг-треде написано, что нужно начинать с SICP, чтобы научиться программировать Вот, пожалуйста, та же самая программа, но переработанная под язык Python: http://composingprograms.com/ (нужно знать ангельский или уметь пользоваться переводчиком)
— Как можно без лишней возни ускорить программу на питоне 1) проверь сначала свой код, алгоритмы и структуры данных. Чаще проблема здесь. 2) код можно иногда феерично ускорить, используя JIT (Just-in-Time) компиляцию. Почитай обязательно про модуль numba, он ставится через pip, и альтернативный интерпретатор PyPy.
— Дайте нормальные книжки на русском! Мы, блядь, не в пиндосии живём Брат, смотри книжки по ссылкам в шапке, там есть и русские. Но помни, без языка ангелов твоя жизнь проходит мимо и ты обречён быть на обочине знаний и технологий.
ps: анон, если ты вносишь изменения в шапку, оставляй ссылку на код с обновлённым исходником. Исходник: https://dumpz.org/bASGKD8cCFDf
Тестовое задание: необходимо сделать tcp сервер, который распознаёт заданный формат данных и отображает его в требуемом формате. Обязательна запись данных во внешний файл. Интерфейс и способ отображения на выбор разработчика. Формат данных BBBBxNNxHH:MM:SS.zhqxGGCR Где BBBB - номер участника x - пробельный символ NN - id канала HH - Часы MM - минуты SS - секунды zhq - десятые сотые тысячные GG - номер группы CR - «возврат каретки» (закрывающий символ) Пример данных: 0002 C1 01:13:02.877 00[CR] Выводим «спортсмен, нагрудный номер BBBB прошёл отсечку NN в «время»" до десятых, сотые и тысячные отсекаются. Только для группы 00. Для остальных групп данные не отображаются, но пишутся в лог полностью. Язык Python, версия не ниже 3.2 Передача данных должна поддерживаться с помощью telnet клиента.
У меня такая проблемка. Я добавляю конфиг в yaml. Считываю его в global() в config/__init__.py. Так вот, когда делаю import config config.TEST_CONF то в иде подсвечивает, что не знает TEST_CONF, потому что она считана из файла. Как сделать, что он понимал что за конфиг и мог прыгнуть к определению?
Сап. Есть 2 тестовых. Одни хотят что-то с gRPC, а другие с FastAPI. Сделать нужно за выходные. Хочу объединить. Ещё хочу туда рест, микросервисы и асинкио добавить. Но нет идей что делать. Какое-нибудь туду приложение, которое с консольным клиентом по рпц общается, а сам конвертирует в рест и по хттп с соседним приложением общается, которое как раз всю работу с бд делает? Чёт примитивно. Есть что-нибудь, что будет реально получать пользу от использования этих технологий, а не технологии ради технологий
Сейчас потихоньку вкатываюсь в питон, и при рефакторинге своего старого кода возник технический вопрос. Мой код представляет из себя функциональщину, я там форматирую разный текст - нарезать строку, что-нибудь к ней добавить, где-то инвертнуть и т.д. Таких функций у меня несколько подряд, и форматирование в каких-то функциях повторяется, они отличаются только текстом, который надо отформатировать. Сейчас я переписал это в одну функцию, которая принимает на вход несколько разных текстов, и меня озадачил вопрос - а от этого изменения сам по себе код стал быстрее? Или я просто увеличил читабельность кода, снизив его повторяемость?
Подскажите как лучше организовать работу с большими строками: имеется программа, которая переодически выплевывает клиенту много текста от 10 до 500 символов, таких текстов +- 50 Варианты, которые я рассмотрел: 1) Самый примитивный вариант: иметь файл.py с глобальными переменными, в которых хранятся строки hello_text = "..." bye_text = "..." 2) Использовать Enum: class SomeText(str, Enum): hello_text: str = "..." bye_text: str = "..." Более сложный для редаченья текста вариант, просто юзать import SomeText, можно обращаться по ключу, а не только черз точку, что важно но постоянно юзать SomeText.hello_text.value ну такое 3) Использовать БД: слишком заёбистый вариант, хотя можно запилить админку для редактирования обычным человеком 4) Использовать JSON + pydantic: class Text(BaseModel): hello_text: str = "..." bye_text: str = "..." texts = Text.parse_file("texts.json") text.hello_text Более сложный вариант чем Enum, но JSON же проще редактровать обычному человеку чем file.py, да? Какие ещё варианты есть?
ананасики, что за дела Пилю простой круд на джанге, подключаю js файл в html документе, через %static% Когда загружаю сайт, то получаю код 200 (тобишь файл js получен и все хорошо), как я понимаю Но сам файл js ни в какую не работает, ни alert, ни вывод в консоль
Хотя если прописываю код в самом документе html через (<script>), то все ок. Как это исправить?
Это правда что JavaScript и Python пиздец как похожи? Я просто недавно вкатываюсь во все это(в универе я вот С++ изучал) и только, что заметил это момент И вообще что JavaScript - это тупо маркетинговый ход, сам язык к жабе не имеет никакого отношения. Так вот, похожи они это потому что они оба скриптовые или потому, что суть если уж на то пошло все языки похожи. Ну и еще, если кому не лень, можете пояснить за скриптовые языки, я честно гуглил, ну да читаю вот, да слова и даже смысл понимаю, но вот сути нет.
>>2166242 Это галера на проект. В двух разных проектах есть эти технологии, а у меня нет с ними опыта хотя и теорию знаю. Так на собесе и сказал. Интервьюер усомнился, что я справлюсь и хрюша попросила почитать про них и какой-нибудь мини-демо показать, что осилю. А потом его проревьювят. Офер уже выкатили. Осталось проекты показать и они пойдут меня заказчику показывать. Если не справлюсь, то буду другого заказчика ждать
>>2167088 Они совсем не похожи. Есть некоторые тренды, которые популярные языки подхватывают, но не более того. Всё это было раньше сделано в си, перле и лиспе.
Читаю шо гугл изобрел Go как такая своеобразная альтернатива Петону Гвидо. У го хороший баланс производительности, простоты и безопасности. Зачем же тогда сегодня нужен петон окромя датасаенс?
for x in range (2): for y in range (2): for z in range (2): for w in range (2): F = (( not x or y) and (not y or w)) or (z == (x or y)) if not F: print ( x,y,z,w )
выводит 0 1 0 0 1 0 0 0 1 0 0 1 1 1 0 0 (все верно) А этот код for x in range (2): for y in range (2): for z in range (2): for w in range (2): F = not(( not x or y) and (not y or w)) or (z == (x or y)) if F: print ( x,y,z,w ) выводит это 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 Разница ведь в том, что я переместил not на другое место.
>>2167110 Гугл изобрел го, что бы студенты могли сносный софт писать, с выразительность там полнейший пиздец, а такой перформанс, который он тебе предлагает тебе нахуй не нужен будет в 90% случаев
Сап двачик, я у мамы инженер. Хочу написать тулзу в вебе по расчету кое-какой конструкции. В питоне для этого есть неплохие библиотеки, да и в целом язык простой как два пальца. Но вот насчет интерфейсов и пр. мне не совсем понятно, как будет работать такое веб приложение. Вот в джаваскрипте расчеты будут производится на машине пользователя и в целом как и все джс приложения будет отзывчывым и интерактивным, мне это и нужно, а что будет с приложением на питоне? Где будут производиться вычесления? Заранее спасибо за помощь, няши.
>>2167335 >Нахуй расчетную программу делать веб приложением >Все 10 человек которым она может понадобиться не обосрутся скачать и установить. Извини, Сычев, но ебись ка ты сам со своей программой, мы лучше по старинке на калькуляторе.
Дано число n. С начала суток прошло n минут. Определите, сколько часов и минут будут показывать электронные часы в этот момент. Программа должна вывести два числа: количество часов (от 0 до 23) и количество минут (от 0 до 59). Учтите, что число n может быть больше, чем количество минут в сутках. Во всех задачах считывайте входные данные через input() и выводите ответ через print().
Мой вариант - препод грит переделывай, все хуйня n = int(input(150)) h = n // 60 % 24 m = n % 60 print(h, m)
А Вот ПИЗДОМРАЗЬ СЫЧЕВА МОЛОДЕЦ
n=int(input()) if n < 1440: print( n // 60) print(n - (n // 60 ) 60) else: if 1440 <= n < 2000 : print( ( n - 1440 ) // 60) print((n - 1440)) else: if n >= 2000 : print(( n - ( 1440 (n // 1440 )))//60 ) print((n-((n//1440)1440))- ((( n - ( 1440 (n // 1440 )))//60)*60))
>>2165167 (OP) сап поступаю бесплатно в яндекс лицей на 2 курса резы собеса дадут не позднее 1 октября (я уверен 95% пройду, тест сдал на 10/10) таквот если в треде есть люди, которые учились там или преподают (лол), опишите, что думаете об лицее
Суп питонач. Не могу разобраться, как предотвратить выполнение импортированных функций в своей программе. Хз, как тут принято скидывать целые проекты, но я залил сюда https://dropmefiles.com/0yDIP В main.py есть описание принципа работы, в целом проблема такова, что при запуске main.py у меня почему-то срабатывают все импортирумые функции, хотя нужно, чтобы сработала только та, которую я выбрал. Пробовал по-разному втыкать конструкцию "if __name__ == main", но это ничего не дало.
Привет, быстрый вопрос: Если я внутри функции делаю os.chdir(), то при выходе из неё программа вернётся назад или это изменит "глобоальный стейт" исполнения? Если второе, то как питонисто вернуться назад?
>>2167907 Рабочая директория это уровень процесса. Если тебе надо работать в конкретной директории то делай chdir, если нет, то работай с относительными или абсолютными путями, очевидно же.
СУка бля чёрт блядь бы побрал ебучие регулярка блядь ёбанный рот есть регулярка r'текст перед ссылкой - (https:[^\\]+)' Суть - взять ссылку между текстом и \n. Проверил на regex101 всё работает бля. Засовываю в re.search и получается хуйня - возвращает во второй группе не только ссылку, но и всё, что после неё. ЧО ЗА ХУЙНЯ БЛЯДЬ
>>2167876 При импорте в любом виде импортируемый модуль исполняется от начала до конца.
Если ты не хочешь, чтобы какая-то часть исполнялась при импорте, надо её поместить внутрь if __name__ == '__main__': ____ и вот здесь этот код ____ в том числе импорты можно делать здесь, но если ты так делаешь, то что-то у тебя не так в проектировании скорее всего
>>2167975 Бляяяяя, в regex101 конкструкция [^\n]+ не работала - тупо до конца текста всё собирал. Но в питоне это почему то работает. Спасибо, конечно, но какого хуя
https://github.com/em1tao/SIGame_script я вообще ничего не понимаю в программировании, пожалуйста объясните пошагово что нужно сделать чтоб запустить этот скрипт. чтоб, как там сказано, я в Своей Игре нажимал q и чтоб программа автоматом нажимала кнопку ответа в нужный момент
>>2167997 Напиши в cmd (командной строке), что тебе сказали аноны (python main.py). Но сначала открой cmd в папке, где у тебя расположен код. Для этого нужно выделить расположение (адрес) папки в проводнике, написать cmd и нажать enter.
>>2168062 я сделал все как там написано, добавил пайтон в path list, в командной строке написал cd и вставил путь к папке, где находится скрипт, написал python main.py, но скрипт не запустился, а в командной строке просто появилась надпись Python.
и да, что этот скрипт вообще делает? как его юзать? while True: try: if keyboard.read_key() == "q": im = grab(childprocess=False) r, g, b = im.getpixel((370, 7)) if r == 255 and g == 230 and b == 130: pyautogui.click(x=1730, y=930) pass if keyboard.read_key() == "p": break except: continue
>>2168070 >while True: пока скрипт крутится >try: пытайся сделать следующее: >if keyboard.read_key() == "q": если нажата клавиша q >im = grab(childprocess=False) захватывай >r, g, b = im.getpixel((370, 7)) RGB цвета пикселя в координатах 370х7 >if r == 255 and g == 230 and b == 130: если красный - 255, зеленый - 230 и зеленый - 130, то: >pyautogui.click(x=1730, y=930) жми на точку в координате 1730х930 >pass жди дальше >if keyboard.read_key() == "p": если нажата клавиша p >break гаси кампутер >except: кроме случая >\tcontinue когда продолжаешь работать
>>2168070 ну, он то и делает. он постоянное работает, если ты нажимаешь q, он делает скриншот, выбирает какой-то конкретный пиксель на экране, смотрит его цвет, если его цвет соответствует какому-то, нажимает на какое-то конкретное место. если нажимаешь p, он выключается. все ошибки и прерывания игнорирует.
>>2168365 А если оставить просто i*j во втором случае? Будет видно, что кушоет аппенд. Хотя я видел, что делают что-то вроде f = res.append и потом вызывают уже f, уменьшая расходы.
https://dumpz.org/cAe6kfR9gGn4 хочу понять парсинги, написал код для того чтобы подгрузить видео. но вместо нужного блока с тегами я получаю пустой блок. почему так?
>>2168318 Да, ты же по сути работаешь в своем модуле с этим объектом, импорт произойдет и так, только через другие библиотеки. Хотя хотелось бы что бы в всеобщую культуру написания питонокода начали входить интерфейсы
>>2168555 Питон хорош тем, что там предусмотрели аннотацию типов очень давно. Пусть изначально она была больше в виде заглушек и декларации о намерениях.
Но в JS такой возможности нет, поэтому там придумывают компиляторы TypeScript, независимый язык, компилируемый в JS. В PHP посмотрел, подвезли какую-то аннотацию в версию 7.4, то это ноябрь 2019, меньше двух лет назад.
В питоне же есть typing, с хорошей поддержкой в самом движке при этом. Объекты имеют свойство __annotations__, доступное в рантайме, очень много что можно сделать за счёт этого, если захотеть.
Насчёт того, почему не надо интерфейсов. Интерфейсы - это необходимость для компилируемых языков, без интерфейсов просто нельзя чисто технически передать какой-то объект в функцию. В функцию необходимо передать адрес таблицы виртуальных функций, которые что-то нужное делают.
В питоне duck-typing, в питоне основное понятие не "интерфейс" (таблица функций), а "протокол", соглашение о том, какие функции нужны.
>>2168553 >Зачем? Ты мыслишь категориями языков вроде Java
Это есть не только в джаве и я не говорил, что нужно реализовывать так же. Необходимо разделять контракт и его имплементацию, выше уже привели пример протоколов, по сути как в ГОвне интерфейсы сделали и это правильно. Правда пока это мало кто делает и слишком сильно заигрывают с динамичностью из-за которой нихуя непонятно что за объект выдает та или иная функция сторонней либы, что даже в небольшом проекте вызывает лютую жопоболь.
>>2168584 >Это есть не только в джаве и я не говорил, что нужно реализовывать так же. Но реально ключевое, как это технически реализовывать.
Подход в стиле Java это class MyClass(BaseClass, InterfaceA, InterfaceB): .... Где class InterfaceA: ____def foo(self, par:str) -> None: ________raise NotImplementedError()
а дальше ты определяешь функцию func(value:InterfaceA): .... Это вот такой конкретный подход в Java-стиле. Многие, кто пришёл с этих языков, пытаются так писать. Вот не надо категорически. Очень порочное и тупиковое решение из мира компилируемых языков. На компилируемых платформах просто сложно сделать лучше.
Для современного питона есть решения намного лучше. Они намного лучше соответствуют концепции "контрактного программирования", более гибкие и прозрачные, лучше поддерживаются.
>>2168584 > пока Это довольно новые технологии для питона, только в свежих версиях они дошли до уровня, когда полезны.
Инертность есть, надо изучить, привыкнуть, паттерны наработать. Плюс код в библиотеках старых и библиотеки принято писать, чтобы поддерживать относительно старый код.
Но очевидно, что к этому движутся довольно активно. Сейчас в питоне активнее всего вокрут типов что-то новое придумывают.
>>2168608 Как-то завезли, но в каком-то нерабочем виде.
Я сейчас стремительно дорабатывают. То есть вот например куча фич появляется только в 3.8, в 3.9 кучу всего добавили.
Протоколы упомянутые в 3.8 появились. Слёту Literal, очень полезная штука, тоже в 3.8. Хотя это фиксится через typing-extensions, но всё равно, это пока развивающиеся технологии.
Причём asyncio тебе даёт принципиально новые возможности, а typing это всё-таки чисто опция, поддержку кода улучшить, без него тоже работает. Поэтому конечно не так резво будут внедрять.
Анон, помоги, плес. Документация: https://dash.plotly.com/cytoscape/elements Код: https://ideone.com/bEVbCb >Invalid argument `elements` passed into Cytoscape with ID "cytoscape-elements-basic". Как передать созданный список словарей на место elements? elements по идее должны пустыми, потому что в ходе программы будут заполняться, но почему-то сейчас вылезает ошибка. Что не так?
>>2168726 Так я в зависимости от условия генерю список словарей и подаю на выход: return [{'data': {'id': x}} for x in some_list] вот только почему-то в таком виде вылетает ошибка. Хотя судя по документации, это правильный формат.
Если кто хоть что может подсказать, буду прищнателен.
сап, погромач нужна твоя помощь с Jinja2 я нихуя не погромист и никогда им стать не хотел, но жизнь сложилась необычно и теперь мне нужно писать код
так вот, помоги решить 2 задачи первая:
мне нужно за день до отправки посылки каждому челу отправлять сообщение с инфой, ровно в 14:00 как посчитать время, которое нужно выставить для ожидания с момента попадания человека в сценарий до 14:00?
вторая за час до отправки посылки мне так же нужно отправить еще одно сообщение
Сяп. Есть джанговская вьюха, которая принимает эксель-файл, через опенпайхл его парсит в памяти и отдаёт результат. Если файл прошёл валидацию, его дальше нужно обрабатывать, т.е. идёт новый запрос к другой вьюхе. Вопрос: как в памяти держать объект Workbook, чтобы не приходилось файл заново обрабатывать? Либо так не получится, и нужно его где-то хранить на диске, например NamedTemporaryFile?
Сап, аноны, помогите с Selenium. Как ему передать уже готовый html, чтоб он его загрузил и открыл страницу? Знаю, что у puppeter у класса Page есть метод setContent(), есть что то похожие у Selenium?
Но блин, вылезла новая трабла - как в селениуме добавить заголовки?? попробовал selenium-wire, но после первого перехода перестают открываться страницы с ошибкой "selenium-wire". Как решить эту проблему?
>>2170252 Маловато будет. Дохуя пакетов. Проекту 5 лет, наверняка мажорные версии сломают кучу всего. К тому же и сам питон хотелось бы обновить. Вот даже не знаю, с чего начать.
>>2170383 Не работать там, где есть много говнолегаси А вообще, я бы сначала обновил все библиотеки и прогнал бы тесты (они же там есть и покрывают бизнес-логику?)
>>2170424 Да тесты есть на каждый пердеж. Ну в целом складывается ощущение, что какой-то супер страты для обновы нет. Ебошишь и смотришь что сломалось. Хуево, конечно.
>>2170589 >Это фреймворки для построения апишек Ты всё правильно понял. Сейчас рыночек в основной такой, что бэк пишет апишку, а фронт пишет приложение на реакте и её дёргает. Всё то, что использует чистую джангу, скорее всего является легаси.
К тому же, ты же спрашивал про то, много ли вакансий на стек React + Django. Ответ: нет, но связка react + DRF/fastapi много где используется, так что смею предположить, что и пригодится такой фулстек куда-нибудь.
>>2170599 Да, но учитывай и то, что отличие DRF от Django не только в том, что "темплейты выкидываются". В самом DRF куча всего, что нужно знать, чтобы им комфортно пользоваться. Так что после джанги всё равно посидеть ещё придётся
>>2170729 Количество ответов по запросу ничего тебе не скажет, потому что: 1) По запросу "django" может выйти "django rest framework" 2) Иногда пишут "Желательно знать django", а вакансия вообще на PHP утрирую 3) Как я и сказал, есть вакансии на django, но они с легаси. Хочешь копаться в этом? Ныряй.
А вообще, давай мы вернёмся к первому твоему вопросу. >Много вакансий с таким стеком? Ты же сам на него ответил: >на hh.ru: >290 вакансий «react django» >155 вакансий «vue django» Так зачем спрашивал?
>>2170747 Я подразумевал скорее востребованность и актуальность относительно других технологий для бэкенда, а не конкретное число вакансий. Кроме hh.ru есть же множество других площадок для поиска работы.
>Так зачем спрашивал? Ну теперь понял, что Django неплохо бы освоить, но в дальнейшем стоит смотреть упомянутые тобой штуки.
Как в redis stream передать многомерный словарь? Он жрет только одноуровневый, а типа {'a': 1, 'b': {'a': 1}} уже нет. Сериализатором нельзя, он ожидает словарь на входе.
кто то шарит в pyrogram? Как сейчас работает get.messages? почитал документацию, сделал по ней вылетает ValueErorr, разные значения в message.id ставил, оставлял только chat.id, не работает, подскажите аноны, как получать сообщения юзерботом на пирограмме?
Суп питонач. Я могу как-то с помощью pip'a узнать какие версии питона поддерживает текущая версия модуля? Или как я вообще это могу сдалеть не заходя в гитхаб и не смотря ченжлоги?
>>2171581 В случае джанги и его орм очень просто юзать графкуэль, в остальном это ебля с оптимизацией запросов к БД + нельзя сделать нормальное кеширование + ебля с проверкой прав доступа.
Результаты 40 отправленных резюме на Python Junior позицию
Из 40 отправленных резюме мне ответило только 3 HR, 14 человек написали что не подхожу, остальные заигнорили.
Первый HR
Прошли с ней общение, сказала идем на тех собес, я обрадывался, следующий тех собес назначен сразу на некст деньги, я немного подготовился, немного запросики повторил и т.д.
Результат тех собеса:
Меня не спросили не одного вопроса по питону, 80% вопросов было по БД и оптимизации запросов, я все это почти провалил.
Пришел ответ от HR :Вы нам не подходите
Следующие два собеседования -
Мне отослали тестовое,первое я выполнил минут за 30, второе за 3 часа, хотя давали до 7 дней там и там, но мне не ответили, а там вышло строчек 50 кода в 1 и строчек 300 в другом, все четко, просто игнор.
У меня уже жопа горит, я блять не знаю, я готов за копейки работать ради первого опыта, но даже шанса не дают попасть на тех собес, а тестовое задание такая хуйня.
ИМХО, если вы самоучка и не успеете запрыгнуть до ~2022 года вы в провале. Сейчас на рынок начнут выходить одебелевшие гигкбрейнсовые-скиллбоксшвайны, которым пообещали за 8 месяцев учебы зарплату в 50к. Если вы не учитесь в норм универе у вас очень очень мало шансов.
>>2171780 >ИМХО, если вы самоучка и не успеете запрыгнуть до ~2022 года вы в провале Никогда так не говорили! Еще бы найти ту древнюю шешебку, где на соц рекламу наложили пасту про вкат и коммиты в одну ветку
>>2171722 А вам говорили про нетворкинг. Я вот учусь в максимально провинциальном говновузе по айти специальности, учат хуйне полной, но один из одногруппников оказался пиздец пробивным челом и уже на третьем курсе синьором-помидором стал в одной галере. И тут включается кумовство непотизм нетворкинг, с минимальным собесом взяли джуном в эту контору. Ну он меня не напрямую протянул если что, у него таких полномочий нет и в принципе он фронтенд. Короче заводите правильные знакомства, пацаны.
>>2171722 >второе за 3 часа > строчек 300 в другом, все четко, Как можно за 3 часа высрать 300 строчек и что за лютый пиздец будет вместо кода, если так писать? Если не копи-паст из другого места и старых наработок, конечно.
В чём разница между питоновскими abc/collections.abc и typing?
В питоне для описания типов есть два механизма. Один это "абстрактные классы", второй typing.
Вот это сбивает конкретно, на что вообще смотреть и что скорее использовать? Даже официальных рекомендаций нет. typing вроде более новый, активно развивается, но в официальных доках в typing часто идёт отсылка к abc.
abc нравится тем, что вот красивая поддержка рантайма, можно всякие isinstance делать, хотя класс реально не наследован. Но тяжеловато и есть ощущение legacy. А typing вроде как модно и молодёжно.
Если я хочу какие-то свои типы-протоколы задекларировать, через что лучше делать, на 3.8+?
>>2171920 typing — это про type hinting (статическая типизация на минималках), abc и abstractmethod — это про интерфейсы. Два совершенно разных инструмента, а ты их в одну кучу смешиваешь
> Если я хочу какие-то свои типы-протоколы задекларировать Что именно и зачем?
>>2171923 Смысл в том, что мне надо как-то задекларировать тип объекта, который я могу передавать в фунцию. У объекта должно быть несколько методов, то есть это "протокол".
abc интересны тем, что там возможность проверки в рантайм есть, через isinstance. typing интересен тем, что модули вроде mypy делают более глубокие проверки, на соответствие методов тому, что надо, а не просто наличие этих методов, что вообще важно.
А вообще, я как-то серьёзно этими технологиями не пользовался, но сейчас понимаю, что пора понимание улучшать в этой части.
>>2171937 Кмк, ты пытаешься решить абстрактную задачу, оттого и нет хорошего понимания, каким путем пойти. Лучше все же решать реальные и конкретные задачи.
> мне надо как-то задекларировать тип объекта, который я могу передавать в фунцию Зависит от того, зачем тебе. Если ты хочешь сделать интерфейс метода более понятным для программиста — добавь type hint-ов. Про type hinting есть мотивационный PEP, не помню номер. Там отлично описано, как работать с кастомными типами данных и с generic-ами. Но type hinting — это не совсем про улучшение читаемости кода, это больше про линтинг через mypy.
С abc тоже интересная история. Чаще всего, они больше усложняют код, нежели упрощают. Поэтому надо смотреть на конкретную задачу
По теме, советую книжку Expert Python Programming, там как раз есть главы про это все
Как это работает? Ошибка старая будто закешировалась и теперь всякий раз выскакивает при вызове функции из модуля. Даже если функцию не использовать, то ошибка всё равно выскакивает.
>>2171941 У меня задачи как раз самые что ни на есть практичные.
Я передаю какие-то объекты в функции-методы, пихаю их в очереди. При этом мне надо задекларировать тип, чтобы было понятно, что от объекта требуется.
Даже в форме лёгкого деанона. Есть класс, который делает обработку сложных данных. Там есть методы "подгрузить данные", и в зависимости от того, что за данные, могут быть какие-то события возникать.
Для обработки этих событий класс имеет что-то вроде коллбэков. Но точнее, мне хочется туда передавать объект вида "очередь", а точнее объект, имеющий методы вроде put_nowait. Это может быть как обычная очередь queue.Queue, так и asyncio.Queue, так и специальный мой класс совсем другого рода, то тоже имеющий такой метод.
Я столкнулся с тем, что хочется как-то описать этот тип, те метода, которые в нём нужны, но я не очень понимаю, как это грамотно сделать.
> передавать объект вида "очередь", а точнее объект, имеющий методы вроде put_nowait. Это может быть как обычная очередь queue.Queue, так и asyncio.Queue, так и специальный мой класс совсем другого рода, то тоже имеющий такой метод
>>2171941 >По теме, советую книжку Expert Python Programming, там как раз есть главы про это все Глянул, на удивление находится по первым ссылкам книжка. Про эту тему там похоже ничего адекватного нет и вообще книжка хоть и свежая, но уже устаревшая. Она про 3.7, а очень много по тебе добавилось в 3.8+.
Но вообще по некоторым другим темам, более серьёзным, книжка смотрится очень интересной и полезной, на первый взгляд, стоит изучить, так что спасибо.
>>2171953 >def func(queue: typing.Union[queue.Queue, asyncio.Queue, CustomQueue]) Вот это смотрится очень грязно и костыльно. Я не хочу привязываться к конкретным функциям в принципе. В частности потому, что я хочу, чтобы можно было передавать любой тип, главное, чтобы там были определены некоторые меторы. В объем условно "реализован интерфейс", но без наследования от интерфейса.
Чтобы был полноценный duck typing.
В принципе в typing есть для этого typing.Protocol. Я даже как-то пока так сделал, работает. Но нет уверенности, что я делаю идейно правильно.
>>2171955 > хочу, чтобы можно было передавать любой тип, главное, чтобы там были определены некоторые меторы. В объем условно "реализован интерфейс", но без наследования от интерфейса
Тогда через abc и abstractmethod, если тебе более-менее каноничный способ нужен. В книжке, которую кидал, как раз есть пример. Но
> без наследования от интерфейса
Не понятно, откуда такое желание. Явное лучше неявного, все таки. Если у тебя слишком обобщенный и универсальный интерфейс -- это может создать лишнюю сложность. Простой интерфейс -- это один из критериев хорошо спроектированной системы
>>2171955 Кстати оказывается всё намного проще, если в питоне 3.8, или если испольовать typing_extension в более старых версиях.
Есть специальный декоратор @typing.runtime_checkable который позволяет для протоколов делать проверку через issubclass и isinstance. То есть мне не надо самому абстрактный класс реализовывать, всё typing делает за меня.
Я пишу @typing.runtime_checkable class TypeQueue(typing.Protocol): ____def put_nowait(self, element): ________... # рекомендуется именно троеточие
и после этого def foo(q: TypeQueue): ____ code
и не только mypy отловит, но и в коде я могу сделать def foo(q: TypeQueue): ____ if not isinstance(q, TypeQueue): ________ raise TypeError
и всё будет работать. Но в рантайме оверхед, конечно, и проверка ограниченная - только наличие методов. mypy может проверить соответствие методов более детально. Но зато просто в коробке.
И не нужно никакого наследования от интерфейсов.
Я могу использовать queue.Queue или asyncio.Queue, или любую чужую библиотеку и не вносить в них изменения никакие.
>>2171961 >Тогда через abc и abstractmethod >Не понятно, откуда такое желание И как он заставит asyncio.Queue унаследовать от этого ABC? По-моему, Protocol как раз единственное разумное решение здесь.
>>2172037 В документации достаточно инфы, тебе нужно книги по распределенным системам смотреть что бы не обосраться с асинхронностью, потому что когда дело доходит до изменения стейта начинается лютая жопа
>>2172200 Когда ты начинаешь работать любой более-менее большой системой с очень большой вероятностью она будет многопоточной. Причем ты даже в однопотоке можешь обосраться. И вообще, асинхронность и многопоточность это ортоганальные вещи.
Вот например, есть у тебя состояние, тебе нужно получить и изменить его если оно соответствуюет определенным условиям.
Решил значит помимо sqlite изучить и что-то серьезнее. Взял докер значит, накатил постгрес, pgadmin. И там оказывается надо создавать базу данных, потом ещё какую-то схему и аж тогда таблицу, когда в sqlite вроде сразу таблицу создавал.
База данных у меня что-то типа postgres_test, потом идёт схема mysuperapp и аж потом таблица test То я типа теперь должен используя sqlalchemy в модели постоянно дописывать __tablename__ = "test" __table_args__ = {"schema":"mysuperapp"} ? Оно-то работает и строчка туда сюда, но мне чет не нравится так дописывать и вроде у других в коде такое не видел. Что мне надо поменять, чтобы просто было без типа того тэйбл аргс?
>>2172953 При этом при подключении я же писал что-то вроде postgresql+asyncpg://user:password@localhost:1337/mysuperapp Ну это оно базу данных определило, а дальше схема с таким же названием и её уже указываю
Типа postgres_test -> mysuperapp -> mysuperapp -> test
>>2165167 (OP) Аноны, посоветуйте ресурс или книгу чтобы научится писать качественный код на сабже? Работаю в R§D уже 4 года, язык знаю но мой код похож на парашу может есть чтото для чистоты и качества кода именно
Как в джанге получить файл настроек, не зная имени приложения, в котором настройки? Мне нужно написать модуль, который можно сразу в готовый проект вставить и его не редачить, но в нём надо что-то из настроек подтягивать, для чего надо имя приложения знать.
Поможет кто по асинхронщине? Сделал через aiomisc сервис типа PeriodicService В коллбеке парсятся данные и делается сохранение в бд. Почему-то именно сохранение не отрабатывает и обрывается из-за raise RuntimeError('Event loop is closed') Сильно палками не бейте, асинхронщину учу недавно. Почему цикл закрывается до окончания работы запроса? python3.9
>>2174018 Скорее всего ты запускаешь какую-то задачу и реально не ждёшь её окончания.
Очень часто когда ты пишешь в функции main() await something.run() на самом деле что-то просто запускается в фоне и ты окончания не ждёшь. Это самая обычная история.
Попробуй в конце фунции main(), или той функции, которую ты через asincio.run() запускаешь, сделать await asyncio.sleep(10). Вот чтобы не закрылось всё сразу.
>>2174001 отладочная печать ничего не умеет. я просто хочу выяснить что не так с этим кодом, где я не соблюдаю синтаксиса, я не могу понять почему код ничего не выдает! https://onlinegdb.com/66UjCXc--
>>2174030 Тебе не кажется, что программирование это не совсём твоё? Код ничего не выдает, потому что условие x==297 and d==117 у тебя не выполняется ни в одной итерации цикла. Чтобы наглядно в этом убедиться, достаточно посмотреть значения d, в случае если x=297, d не принимает 117.
>>2174040 мне просто задачку по математике надо решить, знаю, что не мое, > Код ничего не выдает, потому что условие x==297 and d==117 у тебя не выполняется ни в одной итерации цикла. Чтобы наглядно в этом убедиться, достаточно посмотреть значения d, в случае если x=297, d не принимает 117.
Питонач, не понимаю, как продвинуться в изучении языка дальше. Я довольно хорошо задрочил стандартные типы данных и операции с ними, процедурное и функциональное программирование, модульность. Взялся за ООП - но все гайды/туториалы/видосы на ютубе даже длиной в час описывают ООП ровным счетом одинаково: class Animal, dog = Animal("Bobik", "woof-woof"), dog.speak() Как это все применить в практической плоскости?
>>2174184 >Начинай писать свои проекты Так я пишу, вот по работе недавно хуитку для автоматизации написал. Там и модульность, и аутентификация, и запросы из разных баз данных, и запись в третью базу данных, и форматирование данных, и даже работа с гитом и ci/cd. Но это все функциональщина, а вот как перенести логику функций, когда алгоритм просто следует от предыдущей операции к следующей, на логику классов, когда есть все вот эти полиморфизмы, наследования и инкапсуляции - вот это я вообще не представляю. И примеры с class Animal вообще не помогают.
>>2174188 Очень полезно даже не самому писать, а с чужими проектами разбираться, как они устроены, работают и т.п. С какими-нибудь небольшими.
А к ООП надо самому придти, чтобы понять, зачем это надо. И смотреть, как это реально используют. Потому что на задачах, что можно в примитивных примерах изобразить, смысла в ООП нет никакого. А на реальных имеет, хотя не на всех задачах.
Почему получаю ошибку 'ModelSelect' object has no attribute 'content'? Согласно докам я через графовые связи могу получить атрибуты и значения другой модели.
Как скомпилировать два файла python в один? допустим есть common.py main.py а нужно получить скомпилированный в виде одного. python -OO -m py_compile common.py main.py создают два файла и соответственно их нельзя запустить, компиляция нужна под linux и windows
>>2174389 Если тебе нужен исполняемый бинарник, не зависящий от питона, это одна история. Nuitka как вариант.
Если тебе нужно просто в виде одного файла собрать, то там другие опции есть, в виде архива собрать (причём вместе с зависимостями можно) и потом архив запускать. Но для этого нужно будет, чтобы питон был в системе. https://docs.python.org/3/library/zipapp.html
>>2174484 А есть годные обфускаторы кода? Просто держать проект на сервере заказчика опасно, кто знает сегодня он платит а завтра заберет себе проект и будет сам им заниматься.
>>2174228 Мне казалось, что ООП - это де-факто стандарт индустрии, вообще любого языка. А если я пишу код на функциях, то это какая-то хуета. Разве нет?
>>2175265 >да на степике чот сертификаты какие-то получил никому не нужные Чем этот принцип отличается от университетского? >ну дома книжки чот читал, что на дваче советовали А что такое образование? Преподование в узкоспециализированном месте набор фактов? По какому критерию оно отличается от набора фактов, полученного дома от книг, или других медия носителей? Образование по факту нужно для социализации (если ты соц. выблядок, который ищет друзяшек), и ради индокринации. Причём последнее было с раннего существования этого социальнного института, а именно в римской империи. Если ты в свои года не понял - что образовани spook времён либерального просвещения объёб гоев на бабки, мне тебя жаль.
Анон, помоги нубу! Хочу сделать бота для линейки через библиотеку pyautogui, но блин, линейка не регестрирует клики, что нужно использовать, чтобы клики регались в линейке?
>>2175265 >>2175110 >>2175333 бля да беги от таких работодателей что требуют высшее или еще какое говно, типа чтобы ты обязательно не курил или пил смузи . это дауны.
У меня пара вопросов по статическим файлам и веб фреймворкам. Как правильно организовать хранение файлов? Ну для своего проекта, просто отдельный каталог? И еще, прям всегда следует nginx использовать для отдать статики? Ну т.е. картинки-то понятно, а видео, например? Если я чанками отдавать хочу? И вообще, есть какая-нибудь альтернатива для обслуживания статики, кроме nginx? Интересует что-нибудь в асинхронных фрейворках. У многих есть что-то вроде serve_static, но это для чего, если не рекомендуется использовать?
>>2174188 Пока код не сильно отличается от стандартных примеров, выделение объектов не нужно. А вот когда что-то действительно свое пишешь, у этой штуки появляется свое состояние и интерфейс, который в глобальной области вообще не к месту, ему бы свою область сделать. Вот с этого и начинается ООП. Когда хочется сгруппировать все в папочки и навести порядок.
>>2175399 Так ты не загружаешь на cdn свою статику, он запрашивает у тебя, а потом только кеширует. Ты хоть почитай что советуешь. Я спрашиваю, как организовать хранение статики, а не как быстро доставлять её в любую точку
>>2175416 >Так ты не загружаешь на cdn свою статику Это зависит от CDN, например, s3 хранит все данные у себя, а ты просто встраиваешь в свой сайт ссылки
>>2175427 Тот самый s3, который может откручивать в минус твой баланс и ты потом квартиру должен продать, чтоб рассчитаться за счет от ddos по запросам?
>>2175430 Если ты проебался с настройками оплаты, что бы не уходить в минус это твои проблемы. В любом случае жирный контент это не то, что ты должен хранить у себя.
У меня как-то был проектец - чувак купил на месяц доступ к каким-то инфоцыганским курсам про успешный успех и хотел скачать их себе. Там был обычный вордпресс и unlisted ссылки vimeo. Ну я четенько скачал на пару впсок, запущенных на день, а потом оттуда синкнул ему на гугл-драйв. В районе терабайта там этого говна было, надеюсь они потратились чуток, лол.
>>2175434 А как ты настроишь его? Если только метрику по количеству запросов делать будешь или считать сколько у тебя биллинг. Т.к. бабки у тебя откручивает не в реал тайме, а через час-два или больше. Так что загнать тебя в минус не так уж и трудно. Компании и обычные люди жаловались на то, что нет возможности настроить чтоб твое облако уведомляло о приближении нуля или вовсе отключалось, если ты зашел за определенную сумму. Амазону то выгодно
>>2175354 Ёмаё, сегодня целый день пытался обойти эту шнягу, вроде называется Smart Guard. Даже AHK не работает, может кто знает, как обойти эту штуку? Все библиотеки испробовал...
>>2175553 Хуйня для защиты от автоматизации не дает тебе что-то автоматизировать? Удивительно. Ну что тут можно сказать - бери книгу по с++ и учи, сделаешь драйвер и обойдешь его на уровне ядра. Как сделаешь, приходи.
>>2175384 >Вот с этого и начинается ООП. Когда хочется сгруппировать все в папочки и навести порядок. Ну хз, разве не для этого как раз модульность нужна? Вот на примере моей приложухи - есть точка входа main.py, есть папочка controllers, в ней по отдельному .py файлу для контроллеров баз данных, отдельно лежит аутентификация, в /app лежит логика, в /output лежит выход. Вроде норм все расфасовано по папкам.
>>2175807 В моем понимании модуль это то же самое что и библиотека, набор функций без состояния. Вот пример, когда мне кажется очевидно преимущество ООП, это Micropython. Класс SPI работает одинаково для аппаратного и программного варианта. То же самое с таймерами и другой периферией. Если даже в таком случае тебе проще сделать функции отдельно, данные отдельно, то я даже не знаю, наверное тебе ООП ни к чему вообще.
Анонэ, а как понять, что ты уже кодишь на уровне джуна или даже продвинутого джуна? Какие проекты нужно уметь реализовывать? Какие критерии? Одно же дело знать синтаксис, отдельные какие-то технологии, но какова должна быть практическая реализация, чтобы ты мог бы быть уверенным в том, что потянешь уже работу в компании? А не жиденько обосраться в итоге и быть выпизженным с позором.
>>2176203 Если при виде полноценной задачи (а не задачки в три строчки) ты не дрищешь в штаны и знаешь, что делать. Все эти градации отделяет лишь сложность таких задач.
>>2175399 >На твоём говносайте канал закончится, когда там 10 человек будут видео смотреть. Только CDN тебе поможет. Стоимость трафика на CDN раз в десятки раз выше, чем трафик на vps/серверах. Если у тебя заканчивается трафик на рядовом vps/dedicated сервере, то это значит, что ты бы на AWS уже заплатил за него сотни долларов. Тогда как впс такая стоит десятку.
Я скобкоёб, меня стиль K&R выводит из себя, что уж говорить про висящие куски питонокода. Ужасает невозможность написать if/for/etc() {} в одну строчку. Как питон можно превратить в скобкоебский язык? Может есть какая-то надстройка над интерпретатором чтобы скобки кругом и всё как в родных сиподобных языках?
>>2176779 CDN будет выгоднее, когда у тебя большая нагрузка, но редкая. То есть скажем в основном у тебя тишина, а потом бац, и прямой эфир с большим трафиком.
Иначе ты будешь платить сильно больше. Причём тут уже очень кусачие цены, потому что видео реально отжирает.
Вот оценки. Если ты вещаешь в 3 мегабита, то час трансляции у тебя будет 1 гигабайт примерно. Если твою часовую трансляцию смотрит 1000 человек, то ты истратишь террабайт. По тарифам амазона ты должен будешь за одну эту единственную трансу заплатить 50-100 долларов. При том, что всего 1000 человек.
Если же ты берёшь себе сервер с лимитом трафика, но с большими лимитами, то там куда скромнее цифры. Вот, например, меньше 1200 долларов в месяц, 10 гигабит подключение и 500 тб трафика. По тарифам амазона 500 тб это больше 20 тысяч долларов. Я сейчас не смотрю на unmetered тарифы, там скорее всего просто очень много пользователей сидит и ты большой канал не выжмешь. Вот пример: https://www.esited.com/hosting/10g-dedicated-server/ про этого провайдера ничего не знаю, просто тут с явно прописанными лимитами и при этом 10 гигабит порт.
Вещать стримы на AWS и аналогах можно только в том случае, если по подписке за деньги полноценные, что каждый пользователь реально не меньше 10 рублей в час платит за то, что смотрит.
Двощ, помоги, умоляю. Есть проект Skylift https://github.com/adamhrv/skylift для ардуино, не могу запустить так как постоянно ошибка синтаксиса python skylift/cli_jobs.py wigle_api --ananas --wigle_api_key QUlEMjJiODA3ODk1ZTFjNGNzA2NDE= --jobs data/jobs/wigle_api.csv File "skylift/cli_jobs.py", line 109 fp_wigle = join(job.path_in, f'{job.filename}.csv')
python skylift/cli_jobs.py File "skylift/cli_jobs.py", line 109 fp_wigle = join(job.path_in, f'{job.filename}.csv')
Анон, какие вопросы задают на собесе на джуниор дата инженегра? Стек Python, Airflow, Clockhouse, Tableau, Docker. Предполагаю, что будут дефолтные вопросы, как и на бэкендера: ооп, бд, базовые алгоритмы. Но может еще есть какие-то по специальности?
Как в aiogram хранить переменные для каждого пользователя свои? При этом сейчас у меня есть состояния пользователя реализованные через class UserStates(Helper)
Подскажите как сделать. Есть небольшое приложение, оно возвращает урлы. nginx отдает картинки. Как сделать так, чтоб от приложения отдавать nginx команду на возврат картинки? Т.е. типа у меня своя учетка, я загрузил картинку. Она доступна только мне. Я не хочу, чтоб другой кто-то по ссылке на пичку смог получить её.
Привет. Работаю инженером в одной госшараге. Для работы написал себе скрипт на питоне, просто обработчик данных. Коллеги очень заинтересовались затребовали себе такой же. С помощью pyinstaller сделал exeшник. Всё работает отлично, но есть одна проблема - при клике на эксешник сначала происходит распаковка файлов и она идёт ОЧЕНЬ медленно. Ну и компы у нас в шараге весьма древние. Т.е. я кликаю по эксешнику, запускается пуская консоль и до запуска программы надо ждать иногда 10-20 секунд. Меня это устраивает, но моим коллегам очень не нравится, что в консоли в течении всей распаковки ничего не пишется. Если бы там было написано что-то типа "Ждите, программа запускается" - это было бы всем понятно. А так люди думают, что просто всё зависло. Но как я понял, вывести такое сообщение во время распаковки просто невозможно. Это блин очень странно, неужели только я столкнулся с такой проблемой? Всё что я смог - это включить дебаг bootloader и в консоль теперь сыпется всякий мусор при распаковке. Но выглядит это максимально криво. Правильно ли я понимаю, что единственный шанс это исправить - добавить к моей проге графический интерфейс с одним-единственным окошком как в консоли, отключить нафиг в pyinstaller саму консоль и использовать встроенный в pyinstaller splash screen? Или может есть какие-то альтернативы? Неужели только у меня эксешник распаковывается так долго? Или это только меня смущает, всем остальным похуй?
>>2178192 Ну мой эксешник весит 35 мегов. Если запустить pyinstaller в onedir режиме - получится папка на 80 мегов. Не знаю, почему так долго распаковывает. Я использую-то всего три библиотеки - pandas для загрузки данных из экселя, shapely для построения геометрии и matplotlib для рисования результирующих картинок. Бывает кстати ещё одна проблема - выводится сообщение "Matplotlib is building the font cache. This may take a moment.", причём иногда оно появляется, иногда нет - но это уже не проблема распаковки понятное дело.
>>2178180 >Это блин очень странно, неужели только я столкнулся с такой проблемой? вообще говоря,да. Ну не стремятся питонисты код шифровать и распространять экзешники. То есть, один из способов решения этой проблемы - поставить коллегам питон.
>>2178338 Кстати да, у нас на работе Касперский параноидальный стоит. >Используй onedir, заебал. И передавать коллегам 80 мегов говна? Блин, эксешник так удобен и выглядит так аккуратно.
>>2178370 >То есть, один из способов решения этой проблемы - поставить коллегам питон. Тогда нужно будет и все библиотеки им ставить. Вообще это возможно, но долго и сложно - нужно будет писать служебку и обоснование нашим админам, потом учить коллег, как запускать питон... Блин, я вообще так-то специально из матлаба в питон перекатился в надежде, что наконец пропадут проблемы с передачей моих прог другим людям.
>>2178371 >Блин, эксешник так удобен и выглядит так аккуратно. Ты инженер или формошлеп? Тебя не должно это ебать. Софт решает задачу и решает ее уникальным образом. Конкурировать не с кем. Похуй вообще. Они будут пользоваться чем угодно, если это экономит им время.
>>2178386 >Ты инженер или формошлеп? Инженер, но мечтаю быть формошлепом. Даже курсы окончил яндексовкие по JS и питону.
>Они будут пользоваться чем угодно, если это экономит им время. Безусловно. Проблема в том, что мне самому не очень приятно, что все впечатление от моей программы портится каким-то сраным распаковщиком.
Наверное, нужно ещё раз объяснить. Мне не важно, что прога долго распаковывается. Подождут 20 секунд, не развалятся, сами расчеты идут достаточно быстро, а пользоваться этой прогой будут относительно редко. Но мне эстетически неприятно видеть висящее чёрное окно консоли с моргающим курсором без каких-либо надписей.
>>2178397 чувак, все прекрасно понятно. Вот такой вот выбор - быть Инженером или Пользователем. Твои коллеги поборят в себе лень, если они инженеры и все будет хорошо.
Никто пока не решил эту проблему и не написать новый интерпретатор питона, такой чтобы он внутри exe работал. Нужны усилия еще большего числа людей.
но можешь еще perl освоить ради смеха. там все это работает.
>>2178401 Это же просто отключит консоль. Станет ещё хуже - при клике на эксешник вообще ничего не будет происходить пока он не распакуется. Даже не поймёшь, кликнул ты по нему вообще или нет.
>>2178402 Так splash screen с консолью не работает, как я понял. Нужно будет писать гуй, или я не прав?
>>2178180 >Правильно ли я понимаю, что единственный шанс это исправить - добавить к моей проге графический интерфейс с одним-единственным окошком как в консоли, отключить нафиг в pyinstaller саму консоль и использовать встроенный в pyinstaller splash screen?
>>2178407 >Нам это не надо. Что и удивительно. Я преполагал, что питон - язык для инженерных расчетов, современная замена фортрана. И что такие проблемы давным-давно решены без костылей. Но ладно.
>>2178412 Инженер-питонист просто проставит что захочет на свой АйМак M1 из незаблокированного интернета. Там даже корпоративные способы контроля не особо работают.
А вы там ебитесь в подвале сами со своим устаревшим железом и без SSD
>>2178418 Лол. Я так-то в филиале Роскосмоса работаю. К которому потом твои инженеры-питонисты на аймаках, роняя по дороге кал, бегают за помощью, когда очередной еба-шаттл ебанет в полете, забрав с собой смертничков. Зато аймак/ссд/интернет на работе, только результатов как не было, так и нет.
Аноны, вопрос не по теме, но в голову пришло его задать только программистам Python, ведь Telegram-боты пишутся на Питоне. Есть ли бесплатный Телеграм-бот, который приветствует нового пользователя, заставляет его решать капчу и при этом приветственное сообщение видно только новому подписчику?
>>2178959 Я херею с этих петушков со стэка - тупо цитируют оф доки питона, но когда им задают вопрос по существу "что значит что ты только что сказал", теряются и убегают
>>2178876 Вот ты додик. Ты разве видел в каналах личные сообщения? Это же канал. Он общий. Никакое api нe заставит Телеграм делать то, что он не хочет делать.
>>2179911 >Набигай, посоны Куда набегать то? Я помню, было время, тут треды за три дня в бамплимит уходили, сейчас этот уже больше двух недель, и только 350 постов.
Питон, похоже, теряет популярность и уходит в андеграунд.
Хотя может это просто вкатуны в программирование заканчиваются.
Пацаны, два вопроса по джанго, выручите пожалуйста.
1. ForeignKeyField для нескольких разных моделей Ну типа: model House .. model Garage ..
и мне нужно в одной модели типа: model Property(model.Model): .. property = model.ForeingKeyField() - в котором можно выбрать гараж это или дом или еще чего. Как сделать это по-тупому я знаю, просто добавить поля property_house = .... property_garage= ... с null=True blank=True и потом функцией смотреть что заполнено, но это как-то всё равно тупо
2. Какой самый простой способ для django выводить простецкие графики? Конкретно - Line Chart. Интересует как решение с JS так и просто картинкой
>>2180866 Напиши скрипты сборки для систем в докере. Сделай сайт-сервис, который будет получать данные, получать данные из редиса, хранить их в кликхаусе/постре/монго.
объясните пожалуйста долбаебу, как убрать ебаную кавычку " из строки? Делаю replace(' " ', ' ') и нихуя, добавил уже блять эту кавычку в библиотеку с пустым значением, библиотеку тоже пидорасит.
Скорее всего, заезженный вопрос, но вот: Что делать дальше? Я посмотрел 2 курса на Степике от института биоинформатики по Питону Писал несколько скриптов для работы с базами данных (на работе таким образом упростил свою задачу, вроде выгрузки из Оракла, сохранения в csv, прохождение по данным из файла в Вертике) и всякую чепуху вроде простейших парсеров и телеграм ботов И вот сейчас у меня ступор: что учить, что писать (особенно это вызывает окаменение мозга), как двигаться? Знаю, тут есть опытные ребята, которые проходили такой этап
>>2181393 Я работаю за деньги, но не программистом, хотя в айти (Business Intelligence Consultant - что-то между аналитикой и дата инженирингом), хочу добавить сюда питон на хорошем уровне, чтобы на лучшие места претендовать.
вот у меня есть список [Not win, 395, Win, 342, Win, 374] как мне найти максимальное число среди тех которые идут после win изменять список нельзя максимальное число не у победителя у проигравшего самое большое число а мне надо большее среди победителей словарь не вариант в нем не могут существовать два элемента с одинаковыми индексами *ключами они просто перезаписывают друг друга
>>2181719 а блять не забыл, это какая-то хуйня с форматированием max([[<твой список>][x] for x in range(1, len([<твой список>])) if [<твой список>][x-1] == "Win"]) Вот бля короче
как в aiohttp client подхватить и сохранить cookie, которые secure=1 , но я с этим сайтом общаюсь по чистому http внутри контейнеров и на самом деле шифрованный трафик только внаружу вылетает? клиент не сохраняет эти куки у себя, но обычные сохраняет.
if start <= TestedDate <= end: print (TestedDate, "Дата находится в диапазоне") Else print("Дата не находится в диапазоне")
Но препод требует чтобы было указан номер этой даты. Как вообще это реализовать? В мыслях есть генерация массива, сравнивание TestedDate c датами в массиве и запрос номера этой позиции. Только хз как это сделать, единственный опыт в программировании был какулятор на делфи несколько лета назад.
Может кто знает, есть телеграмм бот aiogram в котором пользователи могут искать через мою mysql свои данные, когда поиск происходит одновременно не более 2-х человек всё нормально, но когда их около 10-ти и более не хватает ресурсов и всё зависает. Как сделать последовательную выдачу результатов пользователям? Была идея все запросы записывать в таблицу ожидания и другая программа просто через каждые 10 секунд например её проверяла и выдавала результаты, как такой способ будет по эффективности?
>>2182337 Подумай об оптимизации самой программы, а не о выделении ее в отдельный процесс. Десяток пользователей (лол) не должен вешать ни mysql, ни питон.
>>2182351 Чел, побойся бога, sql создавался для работы на компах с килобайтами оперативки. Ладно, с сотнями килобайт. Можешь немножко развернуть, что у тебя там программа делает?
>>2182354 Делает запросы вида: SELECT FROM table1 WHERE (text LIKE '%tags%' OR title LIKE '%tags%') SELECT FROM table2 WHERE (text LIKE '%tags%' OR title LIKE '%tags%') SELECT FROM table3 WHERE (text LIKE '%tags%' OR title LIKE '%tags%') где tags может быть несколько: SELECT FROM table1 WHERE (text LIKE '%tags1%' OR title LIKE '%tags1%') and (text LIKE '%tags2%' OR title LIKE '%tags2%') SELECT * FROM table2 WHERE (text LIKE '%tags1%' OR title LIKE '%tags1%') and (text LIKE '%tags2%' OR title LIKE '%tags2%') на каждого пользователя
>>2182354 >Чел, побойся бога, sql создавался для работы на компах с килобайтами оперативки. Ладно, с сотнями килобайт. Это ты конктерно загнул. SQL создавался в конец 70-х для серьёзных машин того времени.
> Although IBM’s System/R and SQL proved that relational databases were feasible, hardware technology at the time was not sufficiently powerful to make the product appealing to businesses.
> In 1977 a group of engineers in Menlo Park, California, formed Relational Software, Inc., for the purpose of building a new relational database product based on SQL that they called Oracle. Relational Software shipped its product in 1979, providing the first commercially available RDBMS. One of Oracle’s advantages was that it ran on Digital’s VAX minicomputers instead of the more expensive IBM mainframes. Дальше смотрим, что из себя VAX представляли того времени: > Первая серийная модель архитектуры VAX была представлена публике 25 октября 1977 года. Это была модель VAX-11/780 «Star» с процессором KA780 (29 печатных плат ТТЛ) и 4 МБ ОЗУ с коррекцией ошибок (ECC RAM).
То есть тут прямо сказано, что SQL всё-таки работал на довольно приличных машинах для того времени, вовсе не для примитивных.
По своей памяти, на машинах 20+ летней давности тот же MySQL можно было поднять, но это машины с 8+ мб памяти.
Конечно, 2Гб это абсолютный overkill, в этом ты прав. Просто всё-таки цифры другие были. На куда более слабых машинах работали веб сервера с большой нагрузкой, и ничего.
Надо анализировать, какие там запросы работают, сколько времени каждый запрос работает, почему они тормозят, может быть менять структуру запросов. Мне удавалось разгонять более, чем в 100 раз какие-то задачи на базе MySQL, просто корректируя запросы и чуть правя структуру БД.
Если проблема на 10 пользователях, то очевидно это проблема архитектуры базы и запросов, надо вот здесь смотреть, что происходит.
>>2182381 У меня сейчас выполняется по одному запросу на таблицу: SELECT FROM table1 WHERE (text LIKE '%tags1%' OR title LIKE '%tags1%') and (text LIKE '%tags2%' OR title LIKE '%tags2%') SELECT * FROM table2 WHERE (text LIKE '%tags1%' OR title LIKE '%tags1%') and (text LIKE '%tags2%' OR title LIKE '%tags2%') не лучше ли всё это одним запросом выполнить?
>>2182373 Вот если так писать, то не удивительно. Твоя СУБД вынуждена каждый раз полностью сканировать всю базу целиком на предмет вхождения tags.
Что такое tags, откуда они берутся? В каком виде они встречаются в тексте и заголовке?
В норме ты должен при сохранении текста в БД выделить тэги и сохранить информацию об этом в отдельных таблицах many-to-many (это как вариант). Тогда поиск будет быстрым.
>>2182397 tags это слова поиска, например text = 'Раз два три четыре пять...' tags1 = два, tags2 = четыре, если они встречаются то выдаётся запись и так по 20+ таблицам
>>2182403 Вот что происходит в твоём случае. Для каждого запроса вида 'like' MySQL будет сканировать с нуля базу, все записи последовательно. Если у тебя база в гигабайт, то весь гигабайт будет сканироваться. Каждый раз (!!!).
Тебе надо или менять архитектуру, чтобы не было запросов LIKE, либо же надо смотреть на другие решения вроде. По идее какой-нибудь ElasticSearch для таких задач предназначен, но я с ним не работал, не скажу точно, что он умеет.
Всё зависит от того, откуда берутся tags. Если это рандомные слова, которые пользователь может вводить, и таких запросов может быть много, то только вариант с альтернативными решениями. На MySQL такие вещи не делают, обычно ставят на форумах лимиты на количество таких запросов, если подобный функционал есть. Это может работать быстро, только если база небольшая и она вся в память помещается.
Если же tags лимитированы, то можно просто чуть базу переделать, избавиться от LIKE.
>>2182405 SELECT * FROM table1 WHERE (text LIKE '%цифровой%' OR title LIKE '%цифровой%') AND (text LIKE '%медицинский%' OR title LIKE '%медицинский%') AND (text LIKE '%сервис%' OR title LIKE '%сервис%') AND (text LIKE '%«доктор%' OR title LIKE '%«доктор%') AND (text LIKE '%рядом»%' OR title LIKE '%рядом»%') вот реальный, по 24-м таблицам которые выполняются последовательно, получили запись 1-й таблицы, сохранили, второй, сохранили, и т.д. запрос такой занимает 25 секунд.
>>2182423 >По идее какой-нибудь ElasticSearch для таких задач предназначен Глянул, там очень серьёзные стартовые требования к железу и оперативной памяти в частности. Не для бюджетных VPS решение.
>>2182430 Ради теста, попробуй изменить запрос на (условно) select from table1 where (title like variant1 or title like variant2 ...) and (text like variant1 or text like variant2)
то есть перегруппируй title и text.
При этом для title можно сделать индексы, то там надо смотреть с размером индекса, размером записи title и т.п. Но даже без индексов стоит попробовать.
>>2182449 >select from table1 where (title like variant1 or title like variant2 ...) and (text like variant1 or text like variant2) fix, я идиот, это совсем другой запрос по выборке. Надо чуть подумать.
Аноны, я пишу бота для беседы на питоне. Кто-нибудь сталкивался с таким, что бот правильно реагирует на вступление юзера в беседу по приглашению другого участника (chat_invite_user), реагирует на удаление участника (chat_kick_user), но не реагирует на вступление в беседу по ссылке? (chat_invite_user_by_link)
То есть, это же события одного порядка, почему он одни обрабатывает, а другие нет?
>>2182458 и я кстати понял при каких причинах виснет, даже один пользователь может обрушить вбил теги: "ла ла ла" и когда кол-во результатов превысило 60000 память закончилась и запустился своп
>>2182463 >когда кол-во результатов превысило 60000 память закончилась Надо сразу добавлять LIMIT N в SQL запрос. Чтобы в любом случае выборка была ограниченной.
>>2182458 >сейчас 4 гб в дальнейшем скорее всего будет не более 10-ти гб Для VPS это довольно много, ты не можешь поместить всё в оперативную память. Хотя в условиях выделенного сервера это не проблема для таких объёмов.
Суть проблемы в том, что каждый запрос сейчас у тебя требует, чтобы все 4 гб были загружены последовательно из диска в память и проверены на вхождение. Поэтому долго работает.
SQL базы не предназначены для полнотекстового поиска.
Вообще полнотекстный поиск это серьёзная задача, простых решений тут нет. Вот для твоего примера не получится сделать так, чтобы переписать запрос и всё за секунду после этого бы работало.
>>2182485 >блядь, ну заплатишь. задачу же решать надо. поддерживаю, хотя ты не мне отвечал, а не анону, что запрос делает.
Если это не пет-проект, а коммерческий проект, где ты на зарплате, то надо просто ставить вопрос, что нужен выделенный сервер. Цена вопроса на уровне 100 долларов в месяц, копейки по сравнению с зарплатным фондом. По моему опыту кабаны чаще очень легко идут на траты на железо, просто внутренний комфорт есть, типа серьёзный проект = серьёзное железо, а не детская VPS.
Тогда ставится уже полноценный софт, вся база помещается в оперативку и поэтому работает очень быстро. Прикручиваются сторонние решения для поиска, или NoSQL по необходимости.
Но я думаю, даже обычный SQL ускорится на порядок, если ему выделить памяти достаточно, чтобы всё в оперативку влезало.
>>2182487 >SQL базы не предназначены для полнотекстового поиска. причем, все равно умеют его делать. без особенных проблем с производительностью. вопрос только к качеству.
Сап, двощ, есть код, ищет подстроки в строке, сделал логически просто, но безумно медленно. Как его ускорить, не юзая регулярные выражения? Выводит первый индекс первого совпадения. Вроде больший шаг итерации не запилишь, или вообще подход менять
A='qwerwq er bababaobaber okayuo misaka' B='ba@ba' D=B at=[] for i in range(len(B)): if B=='@': at.append(i) n=0 while 1: C=A[n:n+len(B)] for i in at: D=D[0:i]+C+D[i+1:] if n==len(A)-len(B): print(-1) break if C!=D: n=n+1 else: print(n) break
прога вырезает участок оригинальной строки длины подстроки, заменяет собачки подстроки на символы оригинальной строки и собстно сравнивает получившиеся штуки.
паттерн n = 0 while 1: ____if n==len(A)-len(B): ________print(-1) ________break ____if C!=D: ________n=n+1
было бы разумно заменить на for n in range(len(A) - len(B) + 1): ____ calculations ____ return in success
print(-1) # если не вышли из цикла через return, то ничего не нашли
но только мне всё равно не нравится.
уж скорее лучше ближе к Си переписать, чтобы не создавать сначала строку и потом сравнивать её, а просто посимвольно в цикле сравнивать, и игрорировать символ @. Для маленьких строк должно быстрее работать, но для больших шаблонов, где мало @, будет хуже
W] PL (VPS-WAW2). опци Програмісти, хто знає?? як зробитм шоб всі вклабки адресу з цього сайту автоматично замінялись на 2c-pm. я не можу все вручну записувати довго
>>2183006 >Для маленьких строк должно быстрее работать, но для больших шаблонов, где мало @, будет хуже Не, чего это я, для больших обычно будет как раз лучше, потому что очень быстро можно отлавливать несовпадения, не конструируя всю строку.
В приведённом коде меня больше всего вымораживает конструкция for k in at: ____D = D[0:k] + C[k] + D[k+1:]
>>2183045 а еще можно сэкономить две строки, если оба probe = input_string.find(start_token) засунуть модным моржом в while (probe := input_string.find(start_token)) > -1: но это как-то менее читаемо
Реально тут код на строчках 4-15, остальное подсчёт времени. 12 строк кода вместе со строкой комментария, на твоём примере меньше 10мс работы против 44 мс у тебя.
>>2183057>>2183058 >у тебя вариант 44 мс, а мой 10-12 мс Чувак, серьезно? Мерить время выполнения по сообщению из редактора, включающего запуск интерпретатора? Ну держи, обтекай https://ideone.com/IfWZRI
Как сделать так чтобы доступ по разным ключам ссылался на одно и то же значение? Вот есть у нас словарь, где имена заранее отсортированы по группам, например:
Petya, Vasyan Anton, Vasgen, Ramil
Значение для каждого из этих имен - число integer. Я могу его изменять, и когда изменяю его для одного из ключей в определенной группе то оно изменяет и для всех других, например сделал my_dict['Vasyan'] = 100, и теперь в том числе и для my_dict['Petya'] будет возвращаться 100
>>2183085 Теперь попробуй вместо шаблона 'sr@l' подставить шаблон '@sr@l'
Твой скрипт выдаёт None. А должен был выдать 2.
Переусложнено, отсюда ошибки.
Не, я понимаю идею, которую ты хочешь реализовать, но невозможно разобрать твой код, не хочется кучу времени убивать на это. Много "оптимизаций" и не понятно, как обрабатываются особые случаи, которые возникаю. Вот как в случае, когда '@' в начале шаблона. Или когда в конце, там другой баг.
Парни, хуярю элементарный параллелизм на multiprocessing. Вот вроде обычная функция которая возведет все эелементы массива в квадрат. Внизу нахуярен объект MyTimer исключительно для подсчета времени исполнения. Как видите, время у синхронного и параллельного вариант практически то же ("параллельный" даже умудрился отсосать). Шо тут не так?
>>2183518 Во первых у тебя опечатка, ты два раза вызываешь функцию test1.
Во-вторых, использую контекстный менеджер для Pool with mp.Pool as pool: ____data = pool.map(func, splitted) return data
Наконец ты не видишь прироста потому, что главные затраты времени на подготовку списка, разбиение его на куски, пересылку в процессы и т.п. Поэтому ты ничего не выигрываешь.
Попробуй использовать более сложные вычисления, чем возведение в квадрат, вот как в моём примере https://ideone.com/O1MNl8 (на ideone пускают в один поток, поэтому там нет ускорения) и ты увидишь прирост производительности
>>2183545 3.3396499156951904 secs elapsed for Sync 1.1430809497833252 secs elapsed for Parallel
Хм, и правда, когда стал юзать хитрожопые умножения во вложенном цикле, прирост появился
>главные затраты времени на подготовку списка, разбиение его на куски But wait... разбивать список на чанки - это вообще задача по хуйне для питона, оно за константное время происходит. Да и чанков тут всего 10
>>2183558 Тебе данные надо нарезать, сериализовать для отправки в процессы, потом из этих процессов эти данные получить и сохранить в основном процессе. Это главная работа. В то время как само умножение работает очень быстро.
Короче, собираю тестовую платформу. Для строки использую строку str(13 ^ 100500) (в смысле 13 в степени 100500, преобразовать к строке, так как звёзды двач съедает) Получается строка в 111962 символа В ней ищу подстроку '637036977498347229246' по шаблону '63@036@7749@347@29@46' она находится на позиции 110890
Мой вариант на питоне 3.8 на моём ноуте работает за 60мс, на 3.6 кстати быстрее, 55-60мс. На 3.10 те же 60мс
Сделал разогнанный вариант, ближе к стилю Си, работает за 22-23 мс. Намного веселее, но при этом просто поиск подстроки без шаблона работает за 0.1мс, совсем другой порядок.
Контрольный вариант с re, самый примитивный и не оптимальный, работает за 0.5мс.
В общем очевидно, что есть куда разгоняться, но в питоне довольно сложно.
>>2183783 >>2183678 Самая проблема в производительности это вложенный цикл, циклы в питоне медленные.
Если ставить задачу разгона и без re, то возможен вариант с тем, чтобы сгенерировать сначала код без циклов, а потом этот код выполнить через compile+eval
Тогда, думаю, в несколько раз можно ускорить.
Вообще обычно всякие шаблонизаторы на разных языках так и работают. По шаблону сначала генерируется код, раскрывающий шаблон, а потом полученный код уже выполняется. Даже в Си были такие регулярки в древнее время. Все эти джинджи примерно так устроены.
>>2183045 вот это прошло. Загнал строку в 700к знаков, очень быстро скушалось, ну и допилил случай нескольких собачек в начале паттерна,+ упростил, чтоб самому понять. Прям круто, спасиб
что-то туплю, помогите пожалуйста. надо получить строку из 2 строк, складывая по-символьно. string = ''.join(lambda x,y: x,y from s1, s2) где я ошибся?
пример - строки s1 = ГОВНОГОВНО s2 = ПИЗДАПИЗДА. на выходе должно получиться ГПОИВЗЕДОАГПОИВЗЕДОА.
>>2184026 string + ''.join(map(str.__add__,s1, s2)) вот такой придумал, но он не добавляет конечные элементы при разнице в длинах изначальных строк. можно обойти через cycle, но да, зип_лонгест проще. спасибо.
>>2165167 (OP) Что надо прописать в sql запросе, чтоб создать таблицу с поддержкой кириллицы в названии? f"""CREATE TABLE {user_request['name']}( id INT AUTO_INCREMENT PRIMARY KEY, send_massages VARCHAR(1000), get_massages VARCHAR(1000));""")
>>2184035 Ну я хочу чтоб у меня создавалась таблица при регистрации пользователя, для того, чтоб туда сохранять туда его контакты и переписку, типа бекенд для чата хочу сделать, ее же надо сохранить под каким-то именем.
Сап, вкатываюсь в вашу дрочильню. Как лучше всего оформлять таблицы вроде пикрилейтед, чтобы я потом мог имея значение например 800 найти в табличке нужную строку?
>>2184048 Спасибо, няша, все заработало. А то я сначала подумал что эти словари работают как пары ключ-значение, а оказывается можно вкладывать. Лучший тред в этом разделе.
лол >>2184037 уже скинул. >>2184041 temp = {'Температура ':'O,H,C,M,N','000 градусов':'1,2,3,4,5', '100 градусов': '5,4,3,2,1', '200 градусов': '5,4,3,2,1'} print("{}\n{}\n{}\n{}".format(*temp.items())) я бы с форматированием строк поигрался. вообще, можно выводить это списками, '\t'.join(arr[])
>>2184525 >>2184534 у меня дистрибутив с rolling release и думал че там минорное обновление, а тут что-то и venv начало похрюкивать и потом всё откатывать что ли? пиздос думал не спешить с докер контейнером и потом сделать, а тут такое
Есть класс и в нем метод addmit (там еще куча всего, я все неважное обрезал). Так почему компилятор говорит: AttributeError: type object 'meetlist' has no attribute 'meets'?
Есть класс и в нем метод addmit (там еще куча всего, я все неважное обрезал). Так почему компилятор говорит: AttributeError: type object 'meetlist' has no attribute 'meets'?
>>2186410 Потому что meetlist - это название для класса, а объявлять переменные нужно у экземпляра класса, для него всегда зарезервированно первое место параметров у методов внутри классов, которое обычно называют self. поэтому надо исправить: meetlist.meets = [] на self.meets = []
>>2165167 (OP) Сортировать массовчики это конечно хорошо, но вот думаю, ведь многие знают канал Ильи Климова, а есть ли такой же образный Климов но в мире питона ? Можно даже на английском, но лучше на русском офк
>>2165549 На 3 лучше, мне кажется, Джанго это монолит, сделав чутка асинхронности тут, чутка там, в общем результат вряд ли сильно лучше, поскольку дофига остального включая библиотеки на синхронных решениях