Спасибо за видео. Очень классно. А по graphQL strawberry будет видео (обработка ошибок если что-то не найдено или нет прав, авторизация, регистрация, пагинация данных при запросе и т.д.)?
Не знаю откуда предополжение, что f-строки медленнее, мне казалось, что уже давно не так, для себя пруфанул это вот так: import timeit # Исходные данные для подстановки name = "Alice" age = 30 city = "Wonderland" occupation = "Software Engineer" * 100 # Короткая строка def f_string_short(): return f"{name}" def format_string_short(): return "{}".format(name) # Средняя строка def f_string_medium(): return f"{name} is {age} years old and lives in {city}." def format_string_medium(): return "{} is {} years old and lives in {}.".format(name, age, city) # Очень длинная строка def f_string_long(): return f"{name} is {age} years old, lives in {city}, and works as a {occupation}. " def format_string_long(): return "{} is {} years old, lives in {}, and works as a {}. ".format(name, age, city, occupation) # Количество повторений для точности измерений repetitions = 1_000_000 # Бенчмарк results = { "f_string_short": timeit.timeit(f_string_short, number=repetitions), "format_string_short": timeit.timeit(format_string_short, number=repetitions), "f_string_medium": timeit.timeit(f_string_medium, number=repetitions), "format_string_medium": timeit.timeit(format_string_medium, number=repetitions), "f_string_long": timeit.timeit(f_string_long, number=repetitions), "format_string_long": timeit.timeit(format_string_long, number=repetitions), } print(results)
В целом оверхед на логи безусловно есть, но это то, что позволяет отлаживать ход программы + можно гибко настраивать уровни логирования, как в виедо смотрим и в проде выводить только ошибки и ворнинги, а много дебага только у себя локально
@@nikolaypavlin Проблема с f строками достаточно проста, она интерполируется каждый раз даже если не будет записана в лог, а еще в документации прямо написано про отложенную интерполяцию записей в таком стиле logging.info("The value of x is %d", x), в асинхронном коде так и вовсе прикол что по факту записываются слегка неточные логи из за гэпа между реальным созданием f строки и непосредственной записью в ту же ёлку или clickhouse Касательно производительности вопрос к памяти в целом, зачем каждый раз создавать объект f строки, если на уровнях выше debug или даже info они будут куда более редкими. Это что то типо best practices если я вообще правильно помню. В вашей бенчмарке отложенной интерполяции нету да и важно наверно это только где внешние системы логирования аля grafana
@@maksimvasilyev4684 без таймкода сложновато, но концептуально - метод это функция у класса/объекта Но это все про формальные обозначения, я бы не назвал это чем-то важным
Отличное объяснение, все четко и понятно. Мне как начинающему бекендеру было все ясно
Прекрасная подача, все достаточно кратко и по делу. Первый раз столкнулся с логами и благодаря этому видео все смог настроить
Очень крутое объяснение! Всё наглядно, понятно и структурировано. Спасибо
было бы ещё круто эти файлы на гитхаб залить и ссылочку дать. т.к. веду свой конспект и было бы удобно вставить это туда
Спасибо за видео - очень полезно!
Спасибо за видео. Очень классно. А по graphQL strawberry будет видео (обработка ошибок если что-то не найдено или нет прав, авторизация, регистрация, пагинация данных при запросе и т.д.)?
Гениально!
Спасибо тебе большое, жаль дать пока не чего...
Обратная связь - это очень ценно
Мелочь, а приятнААА)))
а можно жит?
Отличное видео!
А вот эти все манипуляции с логами не ресурсно затратны? Мне казалось в бэкенде каждый байт экономят: вместо f строк - .formating и тп
Не знаю откуда предополжение, что f-строки медленнее, мне казалось, что уже давно не так, для себя пруфанул это вот так:
import timeit
# Исходные данные для подстановки
name = "Alice"
age = 30
city = "Wonderland"
occupation = "Software Engineer" * 100
# Короткая строка
def f_string_short():
return f"{name}"
def format_string_short():
return "{}".format(name)
# Средняя строка
def f_string_medium():
return f"{name} is {age} years old and lives in {city}."
def format_string_medium():
return "{} is {} years old and lives in {}.".format(name, age, city)
# Очень длинная строка
def f_string_long():
return f"{name} is {age} years old, lives in {city}, and works as a {occupation}. "
def format_string_long():
return "{} is {} years old, lives in {}, and works as a {}. ".format(name, age, city, occupation)
# Количество повторений для точности измерений
repetitions = 1_000_000
# Бенчмарк
results = {
"f_string_short": timeit.timeit(f_string_short, number=repetitions),
"format_string_short": timeit.timeit(format_string_short, number=repetitions),
"f_string_medium": timeit.timeit(f_string_medium, number=repetitions),
"format_string_medium": timeit.timeit(format_string_medium, number=repetitions),
"f_string_long": timeit.timeit(f_string_long, number=repetitions),
"format_string_long": timeit.timeit(format_string_long, number=repetitions),
}
print(results)
В целом оверхед на логи безусловно есть, но это то, что позволяет отлаживать ход программы + можно гибко настраивать уровни логирования, как в виедо смотрим и в проде выводить только ошибки и ворнинги, а много дебага только у себя локально
@@nikolaypavlin Проблема с f строками достаточно проста, она интерполируется каждый раз даже если не будет записана в лог, а еще в документации прямо написано про отложенную интерполяцию записей в таком стиле logging.info("The value of x is %d", x), в асинхронном коде так и вовсе прикол что по факту записываются слегка неточные логи из за гэпа между реальным созданием f строки и непосредственной записью в ту же ёлку или clickhouse
Касательно производительности вопрос к памяти в целом, зачем каждый раз создавать объект f строки, если на уровнях выше debug или даже info они будут куда более редкими.
Это что то типо best practices если я вообще правильно помню.
В вашей бенчмарке отложенной интерполяции нету да и важно наверно это только где внешние системы логирования аля grafana
Вот вы сказали в самом начале 1.py что это метод, а не функция разве? Я начинающий и хотелось бы понимать..
@@maksimvasilyev4684 без таймкода сложновато, но концептуально - метод это функция у класса/объекта
Но это все про формальные обозначения, я бы не назвал это чем-то важным
Залейте пожалуйста на гит
Лови
github.com/Afaneor/logging-example