🐍 lessslow.py — Python, который не тормозит
Многие считают Python медленным, но это не всегда правда.
Ash Vardanyan в рамках проекта Less Slow показывает, как писать быстрый и эффективный код даже на Python — без магии, но с пониманием.
⚡️ Что в проекте:
- pandas vs polars — что быстрее при работе с миллионами строк
- Использование Numba, Cython, PyO3, rust bindings
- Работа с нативными типами, векторизация и zero-copy
- Сериализация: MessagePack, Arrow, Parquet
- Ускорение JSON: orjson, yyjson, simdjson, ujson
- Как обойти GIL и не платить за удобство интерпретатора
📚 Репозиторий: github.com/ashvardanian/lessslow.py
💡 Даже если ты не используешь всё это каждый день — ты точно станешь писать лучший Python-код.
@python_job_interview
Многие считают Python медленным, но это не всегда правда.
Ash Vardanyan в рамках проекта Less Slow показывает, как писать быстрый и эффективный код даже на Python — без магии, но с пониманием.
⚡️ Что в проекте:
- pandas vs polars — что быстрее при работе с миллионами строк
- Использование Numba, Cython, PyO3, rust bindings
- Работа с нативными типами, векторизация и zero-copy
- Сериализация: MessagePack, Arrow, Parquet
- Ускорение JSON: orjson, yyjson, simdjson, ujson
- Как обойти GIL и не платить за удобство интерпретатора
📚 Репозиторий: github.com/ashvardanian/lessslow.py
💡 Даже если ты не используешь всё это каждый день — ты точно станешь писать лучший Python-код.
@python_job_interview
Каким будет вывод этого кода?
Anonymous Quiz
48%
['AB', 'CD']
10%
['ab', 'cd']
15%
Ничто из перечисленного
14%
Ошибка
14%
Посмотреть ответ
🐍 **LibrePythonista — Python прямо в LibreOffice Calc**
LibrePythonista — это бесплатное и открытое расширение, которое добавляет полноценную поддержку Python прямо в LibreOffice Calc. И да, оно уже поддерживает Pandas, Matplotlib и даже собственный PIP-менеджер пакетов!
💡 Что умеет LibrePythonista:
• 📊 Создание DataFrame, Series и графиков прямо в ячейках
• 📦 Встроенный PIP для установки дополнительных библиотек
• 🔐 Локальное исполнение кода — ваши данные не покидают компьютер
• 🧰 Использует OOO Dev Tools — не требует дополнительных расширений
• 🧪 Пока в бете — можно влиять на развитие
📎 Больше не нужно колхозить скрипты или вручную подключать Pandas/Numpy — всё уже встроено.
🔗 Проект: https://extensions.libreoffice.org/en/extensions/show/99231
LibrePythonista — это бесплатное и открытое расширение, которое добавляет полноценную поддержку Python прямо в LibreOffice Calc. И да, оно уже поддерживает Pandas, Matplotlib и даже собственный PIP-менеджер пакетов!
💡 Что умеет LibrePythonista:
• 📊 Создание DataFrame, Series и графиков прямо в ячейках
• 📦 Встроенный PIP для установки дополнительных библиотек
• 🔐 Локальное исполнение кода — ваши данные не покидают компьютер
• 🧰 Использует OOO Dev Tools — не требует дополнительных расширений
• 🧪 Пока в бете — можно влиять на развитие
📎 Больше не нужно колхозить скрипты или вручную подключать Pandas/Numpy — всё уже встроено.
🔗 Проект: https://extensions.libreoffice.org/en/extensions/show/99231
🐍 Python-задача с подвохом: кто съел яблоко?
У тебя есть список действий персонажей:
Каждое действие — это кортеж:
📌 Правила:
1. Только тот, кто сначала "picked", может "ate".
2. Если кто-то "dropped", он больше не владеет объектом.
3. Нужно выяснить, кто съел яблоко, и проверить: мог ли он это сделать по правилам?
🧠 Задача:
Напиши функцию
-
-
---
✅ Решение с разбором:
```python
def who_ate(actions):
holding = set()
eater = None
for name, action in actions:
if action == "picked":
holding.add(name)
elif action == "dropped":
holding.discard(name)
elif action == "ate":
eater = name
if name in holding:
return "OK"
else:
return "CHEATER"
return "NO ONE ATE"
```
📌 **Как это работает:**
- `holding` — это множество тех, кто в данный момент "держит" объект.
- Как только кто-то `"ate"`, мы сразу проверяем: находится ли он в `holding`?
- Если нет — значит, он **съел чужое яблоко**. Подмена! 🤯
---
🔍 **Разбор на примере:**
```python
# Charlie picked → OK
# Charlie ate → всё ещё держит → OK
print(who_ate([
("Charlie", "picked"),
("Charlie", "ate")
])) # OK
# Alice picked, потом dropped, потом ate → нарушила правила
print(who_ate([
("Alice", "picked"),
("Alice", "dropped"),
("Alice", "ate")
])) # CHEATER
```
---
💡 Подвох в том, что многие решают задачу, просто считая количество действий, **не отслеживая актуальное владение** объектом.
📦 Задача хороша для собесов — проверяет внимание к деталям и мышление в терминах состояний.
У тебя есть список действий персонажей:
actions = [
("Alice", "picked"),
("Bob", "looked"),
("Charlie", "picked"),
("Bob", "dropped"),
("Alice", "dropped"),
("Charlie", "ate")
]
Каждое действие — это кортеж:
(имя персонажа, действие)
.📌 Правила:
1. Только тот, кто сначала "picked", может "ate".
2. Если кто-то "dropped", он больше не владеет объектом.
3. Нужно выяснить, кто съел яблоко, и проверить: мог ли он это сделать по правилам?
🧠 Задача:
Напиши функцию
who_ate(actions: list[tuple[str, str]]) -> str
, которая возвращает:-
"OK"
— если всё законно -
"CHEATER"
— если съевший не имел права---
✅ Решение с разбором:
```python
def who_ate(actions):
holding = set()
eater = None
for name, action in actions:
if action == "picked":
holding.add(name)
elif action == "dropped":
holding.discard(name)
elif action == "ate":
eater = name
if name in holding:
return "OK"
else:
return "CHEATER"
return "NO ONE ATE"
```
📌 **Как это работает:**
- `holding` — это множество тех, кто в данный момент "держит" объект.
- Как только кто-то `"ate"`, мы сразу проверяем: находится ли он в `holding`?
- Если нет — значит, он **съел чужое яблоко**. Подмена! 🤯
---
🔍 **Разбор на примере:**
```python
# Charlie picked → OK
# Charlie ate → всё ещё держит → OK
print(who_ate([
("Charlie", "picked"),
("Charlie", "ate")
])) # OK
# Alice picked, потом dropped, потом ate → нарушила правила
print(who_ate([
("Alice", "picked"),
("Alice", "dropped"),
("Alice", "ate")
])) # CHEATER
```
---
💡 Подвох в том, что многие решают задачу, просто считая количество действий, **не отслеживая актуальное владение** объектом.
📦 Задача хороша для собесов — проверяет внимание к деталям и мышление в терминах состояний.
Forwarded from Machinelearning
Мультимодальная модель от NVIDIA уверенно занимает первое место на OCRBench v2, показав лучшую точность парсинга документов среди всех моделей.
📄 Что это такое:
Llama Nemotron Nano VL — лёгкая vision-language модель для интеллектуальной обработки документов (IDP), которая:
• разбирает PDF
• вытаскивает таблицы
• парсит графики и диаграммы
• работает на одной GPU
– Вопрос-ответ по документам
– Извлечение таблиц
– Анализ графиков
– Понимание диаграмм и дешбордов
📊 OCRBench v2 — крупнейший двухъязычный бенчмарк для визуального анализа текста, и именно NVIDIA Nano VL показывает лучший результат.
@ai_machinelearning_big_data
#Nemotron #NVIDIA
Please open Telegram to view this post
VIEW IN TELEGRAM
🐍 Задача на внимательность и понимание области видимости в Python: «Почему список не заполняется?»
🎯 Цель: Найти, почему переменная ведёт себя не так, как ожидается
📍 Ситуация:
У тебя есть простой код, который должен собирать данные в список из файла:
Но после запуска ты получаешь:
🙃 Хотя ты уверен, что в обоих файлах есть строки с
🧩 Задача:
1. Почему список
2. Почему нет ошибки при обращении к
3. Что будет, если вместо
4. Как правильно модифицировать глобальную переменную?
5. Как сделать поведение явным и безопасным?
🛠 Решение:
🔸 Проблема в области видимости переменных:
Функция использует
Однако
Если бы внутри функции была строка
🔸 Для ясности и чистоты кода лучше делать так:
Или, если обязательно нужно использовать глобальную переменную:
🔸 Проверка:
-
-
📌 Вывод:
В Python изменение содержимого изменяемой глобальной переменной внутри функции возможно без
🎯 Цель: Найти, почему переменная ведёт себя не так, как ожидается
📍 Ситуация:
У тебя есть простой код, который должен собирать данные в список из файла:
results = []
def process_file(path):
for line in open(path):
if "error" in line:
results.append(line.strip())
# где-то в другом месте:
process_file("logs1.txt")
process_file("logs2.txt")
print(f"Total errors: {len(results)}")
Но после запуска ты получаешь:
Total errors: 0
🙃 Хотя ты уверен, что в обоих файлах есть строки с
"error"
.🧩 Задача:
1. Почему список
results
остаётся пустым? 2. Почему нет ошибки при обращении к
results.append(...)
? 3. Что будет, если вместо
append()
просто написать results = [...]
внутри функции? 4. Как правильно модифицировать глобальную переменную?
5. Как сделать поведение явным и безопасным?
🛠 Решение:
🔸 Проблема в области видимости переменных:
Функция использует
results
, определённый вне функции, но не объявляет его как global. Однако
results.append(...)
— это допустимая операция, так как она не переназначает переменную, а вызывает метод объекта.Если бы внутри функции была строка
results = [...]
, Python бы создал локальную переменную results
, и тогда append
бы вызывал UnboundLocalError
.🔸 Для ясности и чистоты кода лучше делать так:
def process_file(path, results):
for line in open(path):
if "error" in line:
results.append(line.strip())
results = []
process_file("logs1.txt", results)
process_file("logs2.txt", results)
Или, если обязательно нужно использовать глобальную переменную:
results = []
def process_file(path):
global results
for line in open(path):
if "error" in line:
results.append(line.strip())
🔸 Проверка:
-
print(locals())
— покажет локальные переменные-
print(globals())
— покажет глобальные📌 Вывод:
В Python изменение содержимого изменяемой глобальной переменной внутри функции возможно без
global
, но присваивание новой переменной требует явного global
. Это тонкое поведение, которое часто приводит к ошибкам, особенно при работе со списками и словарями.This media is not supported in your browser
VIEW IN TELEGRAM
Задача: Что делает эта странная функция teleport и почему она запускает цикл 32 раза?
🧠 Подсказка:
На первый взгляд это выглядит как хаотичная мешанина побитовых операций, но на самом деле здесь происходит реверс битов (bitwise reversal) — отражение битов справа налево.
Но вопрос — зачем делать это 32 раза подряд?
🔍 Что происходит:
Каждый шаг в теле цикла — это стандартная техника реверса битов через маски и сдвиги:
0xAAAAAAAA, 0xCCCCCCCC, и т.д. — маски по битовым паттернам
Итерация for _ in range(32) делает это снова и снова…
💣 Фишка: первый проход уже полностью отражает 32-битное число.
Остальные 31 повтор возвращают число в исходное состояние — но в побитово инвертированном порядке!
📌 То есть:
Чётное количество циклов — возвращает в исходную позицию
Нечётное — делает реверс
👉 Ответ на teleport(0x12345678) будет реверс битов этого числа.
Ожидаемое: 0x1e6a2c48 (в зависимости от реализации может отличаться).
🎯 Челлендж для продвинутых:
Упростите функцию до одного вызова (без цикла)
Напишите inverse_teleport(x), которая возвращает исходное число обратно
🧩 Эта техника используется в:
— алгоритмах FFT (быстрые преобразования Фурье)
— графике
— реверсировании хэшей
— low-level оптимизациях для SIMD
🧠 Подсказка:
На первый взгляд это выглядит как хаотичная мешанина побитовых операций, но на самом деле здесь происходит реверс битов (bitwise reversal) — отражение битов справа налево.
Но вопрос — зачем делать это 32 раза подряд?
🔍 Что происходит:
Каждый шаг в теле цикла — это стандартная техника реверса битов через маски и сдвиги:
0xAAAAAAAA, 0xCCCCCCCC, и т.д. — маски по битовым паттернам
Итерация for _ in range(32) делает это снова и снова…
💣 Фишка: первый проход уже полностью отражает 32-битное число.
Остальные 31 повтор возвращают число в исходное состояние — но в побитово инвертированном порядке!
📌 То есть:
Чётное количество циклов — возвращает в исходную позицию
Нечётное — делает реверс
👉 Ответ на teleport(0x12345678) будет реверс битов этого числа.
Ожидаемое: 0x1e6a2c48 (в зависимости от реализации может отличаться).
🎯 Челлендж для продвинутых:
Упростите функцию до одного вызова (без цикла)
Напишите inverse_teleport(x), которая возвращает исходное число обратно
🧩 Эта техника используется в:
— алгоритмах FFT (быстрые преобразования Фурье)
— графике
— реверсировании хэшей
— low-level оптимизациях для SIMD
🎓 Модульный учебник по Python для Middle-разработчиков
Этот учебник создан для тех, кто уже пишет на Python, но хочет выйти за рамки базовых конструкций. Здесь — практичные модули с упором на архитектуру, производительность, тестирование, чистый код и современные практики разработки.
🔧 Каждый модуль — это отдельный блок знаний: теория + реальные кейсы + трюки из индустрии.
🎯 Только то, что реально нужно миддлу: от дебага и профилирования до async, typing, CI/CD и LLM-интеграций.
Без воды. С кодом. По делу.
📚 Читать
@python_job_interview
Этот учебник создан для тех, кто уже пишет на Python, но хочет выйти за рамки базовых конструкций. Здесь — практичные модули с упором на архитектуру, производительность, тестирование, чистый код и современные практики разработки.
🔧 Каждый модуль — это отдельный блок знаний: теория + реальные кейсы + трюки из индустрии.
🎯 Только то, что реально нужно миддлу: от дебага и профилирования до async, typing, CI/CD и LLM-интеграций.
Без воды. С кодом. По делу.
📚 Читать
@python_job_interview
🐳 Что если вам нужно запустить чужой (возможно небезопасный) код?
Представьте: вам прислали бинарник, Python-скрипт или npm-пакет, и его надо выполнить.
Вы не знаете, что внутри — а вдруг там
🔥 Первый инстинкт: запустить в Docker. Кажется, контейнер спасёт?
⚠️ На самом деле — не всегда.
🛑 Docker ≠ песочница
Контейнеры по умолчанию не изолированы от ядра, сетей и сокетов хоста.
Даже простое
🛡️ Что делать, если код небезопасен:
Также стоит:
• Настроить AppArmor / SELinux
• Запретить монтирование Docker сокета
• Ограничить доступ к
💡 Вывод:
Docker — это удобный инструмент упаковки, но не синоним безопасной изоляции.
Если запускаете сторонний или user-generated код (плагины, CI-скрипты, sandbox-сервисы) — относитесь к нему как к потенциально опасному.
Безопасность — это не "чеклист", а постоянная практика.
#Docker #Security #Sandbox #DevOps #Isolation
Представьте: вам прислали бинарник, Python-скрипт или npm-пакет, и его надо выполнить.
Вы не знаете, что внутри — а вдруг там
rm -rf /
, попытка выйти из контейнера, майнер или установка root-доступа?🔥 Первый инстинкт: запустить в Docker. Кажется, контейнер спасёт?
⚠️ На самом деле — не всегда.
🛑 Docker ≠ песочница
Контейнеры по умолчанию не изолированы от ядра, сетей и сокетов хоста.
Даже простое
docker run -it ubuntu
запускает процесс с root-доступом внутри контейнера.🛡️ Что делать, если код небезопасен:
# Запуск без root-доступа
docker run --user 1000:1000 my-image
# Только для чтения
docker run --read-only my-image
# Удалить все cap-привилегии ядра
docker run --cap-drop=ALL my-image
# Использовать seccomp-профиль
docker run --security-opt seccomp=default.json my-image
# Отключить сеть
docker run --network=none my-image
Также стоит:
• Настроить AppArmor / SELinux
• Запретить монтирование Docker сокета
• Ограничить доступ к
/proc
, /sys
💡 Вывод:
Docker — это удобный инструмент упаковки, но не синоним безопасной изоляции.
Если запускаете сторонний или user-generated код (плагины, CI-скрипты, sandbox-сервисы) — относитесь к нему как к потенциально опасному.
Безопасность — это не "чеклист", а постоянная практика.
#Docker #Security #Sandbox #DevOps #Isolation
This media is not supported in your browser
VIEW IN TELEGRAM
🐍 Задача для собеседования на Python
— Условие:
— Вопрос: что будет выведено в результате выполнения этого кода?
— Варианты ответов:
А.
B.
C.
D.
Правильный ответ:B.
Пояснение:
Функция — это рекурсивная функция, которая накапливает сумму чисел от x до 1, прибавляя y в конце.
@python_job_interview
— Условие:
def mystery(x, y):
if x == 0:
return y
else:
return mystery(x - 1, x + y)
result = mystery(3, 2)
print(result)
— Вопрос: что будет выведено в результате выполнения этого кода?
— Варианты ответов:
А.
5
B.
8
C.
11
D.
Ошибка рекурсии
Правильный ответ:
Пояснение:
Функция
mystery
@python_job_interview
👨💻 Executing — как заглянуть внутрь работающего Python-кода. Необычная библиотека, которая позволяет во время выполнения программы определить, какой именно AST-узел выполняется в данный момент. Это может быть полезно для отладки, анализа кода или создания инструментов вроде умных traceback'ов.
Проект использует хитрый трюк с модификацией AST и наблюдением за изменениями в байт-коде, чтобы точно определить текущую операцию. Хотя функционал кажется узкоспециализированным, его уже используют в нескольких известных инструментах: stack_data, snoop и даже IPython для улучшенного вывода ошибок.
🤖 GitHub
@python_interview
Проект использует хитрый трюк с модификацией AST и наблюдением за изменениями в байт-коде, чтобы точно определить текущую операцию. Хотя функционал кажется узкоспециализированным, его уже используют в нескольких известных инструментах: stack_data, snoop и даже IPython для улучшенного вывода ошибок.
🤖 GitHub
@python_interview
Forwarded from Machinelearning
This media is not supported in your browser
VIEW IN TELEGRAM
📚 ArXiv Research Agent — отличный помощник для научных исследований.
Агент самостоятельно:
• Найдёт релевантные статьи с arXiv, bioRxiv, medRxiv и Semantic Scholar
• Проведёт полноценный обзор и поиск нужных материалов
• Покажет, что упущено, и предложит, что добавить
• Даст инсайты и цитаты из миллионов научных работ
• Генерирует готовые конспекты
И др.
Вскоре обещают добавить поддержку MCP.
🔜 Попробовать: https://www.alphaxiv.org/assistant
@ai_machinelearning_big_data
#agent #ArXiv #ai #ml
Агент самостоятельно:
• Найдёт релевантные статьи с arXiv, bioRxiv, medRxiv и Semantic Scholar
• Проведёт полноценный обзор и поиск нужных материалов
• Покажет, что упущено, и предложит, что добавить
• Даст инсайты и цитаты из миллионов научных работ
• Генерирует готовые конспекты
И др.
Вскоре обещают добавить поддержку MCP.
@ai_machinelearning_big_data
#agent #ArXiv #ai #ml
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 7 000+ упражнений на 76 языках программирования
Exercism — бесплатная платформа для прокачки навыков программирования с нуля. Каждый язык — отдельный путь, наполненный практическими задачами.
Главный плюс — обратная связь от опытных менторов. Ответы здесь не быстрые, зато по делу и без токсичности, как это бывает на Stack Overflow.
https://exercism.org/
Exercism — бесплатная платформа для прокачки навыков программирования с нуля. Каждый язык — отдельный путь, наполненный практическими задачами.
Главный плюс — обратная связь от опытных менторов. Ответы здесь не быстрые, зато по делу и без токсичности, как это бывает на Stack Overflow.
https://exercism.org/
🐍 Python-совет: ускоряй импорт и запуск с помощью `__main__` guard и lazy imports
Когда ты пишешь утилиту или CLI‑скрипт, важно не загружать всё сразу. Используй
🔧 Пример:
📌 Почему это важно:
• Импорты происходят только при запуске, а не при импорте модуля из другого файла
• Снижается время запуска CLI-инструмента
• Уменьшается нагрузка при unit-тестировании, если
• Позволяет использовать файл как модуль и как скрипт
🛠️ Особенно эффективно при:
• больших CLI-инструментах (`argparse`,
• работе в средах, где
🧠 Вывод:
Когда ты пишешь утилиту или CLI‑скрипт, важно не загружать всё сразу. Используй
if __name__ == "__main__"
+ отложенный импорт, чтобы ускорить запуск и избежать лишней инициализации.🔧 Пример:
# script.py
def main():
import argparse
import time
parser = argparse.ArgumentParser()
parser.add_argument("--sleep", type=int, default=1)
args = parser.parse_args()
print("Start sleeping...")
time.sleep(args.sleep)
print("Done.")
if __name__ == "__main__":
main()
📌 Почему это важно:
• Импорты происходят только при запуске, а не при импорте модуля из другого файла
• Снижается время запуска CLI-инструмента
• Уменьшается нагрузка при unit-тестировании, если
main()
не нужен • Позволяет использовать файл как модуль и как скрипт
🛠️ Особенно эффективно при:
• больших CLI-инструментах (`argparse`,
rich
, pandas
и др.) • работе в средах, где
startup time
критичен (например, serverless)🧠 Вывод:
if __name__ == "__main__"
+ локальные импорты = чище, быстрее, гибче.🐍 Хитрая задача для опытных Python-разработчиков
Почему этот код не работает как ожидается?
На первый взгляд, ты ожидаешь результат:
Но на деле вывод будет:
🔍 Что пошло не так
lambda: i не захватывает значение i, а замыкается на саму переменную i, которая одна и та же для всех лямбд.
К моменту вызова всех функций i = 4 (последнее значение цикла), и все лямбды возвращают одно и то же.
Это классический пример late binding — лямбда "вспоминает" переменную, а не её значение в момент создания.
✅ Как исправить
Способ 1: фиксируем значение i через аргумент по умолчанию
Теперь вывод:
Способ 2: functools.partial
🧠 Почему это важно
Такие баги встречаются:
- в колбэках и ивентах (например, при работе с GUI или CLI)
- в генерации функций внутри циклов
- в async-замыканиях и DSL-интерпретаторах
- в тестовых фреймворках, где создаются сценарии динамически
Понимание области видимости, замыканий и позднего связывания (late binding) — необходимый навык для confident-сеньора.
@python_interview
Почему этот код не работает как ожидается?
def magic():
return [lambda: i for i in range(5)]
funcs = magic()
results = [f() for f in funcs]
print(results)
На первый взгляд, ты ожидаешь результат:
[0, 1, 2, 3, 4]
Но на деле вывод будет:
[4, 4, 4, 4, 4]
🔍 Что пошло не так
lambda: i не захватывает значение i, а замыкается на саму переменную i, которая одна и та же для всех лямбд.
К моменту вызова всех функций i = 4 (последнее значение цикла), и все лямбды возвращают одно и то же.
Это классический пример late binding — лямбда "вспоминает" переменную, а не её значение в момент создания.
✅ Как исправить
Способ 1: фиксируем значение i через аргумент по умолчанию
def magic():
return [lambda i=i: i for i in range(5)]
funcs = magic()
results = [f() for f in funcs]
print(results)
Теперь вывод:
[0, 1, 2, 3, 4]
Способ 2: functools.partial
from functools import partial
def f(x): return x
funcs = [partial(f, i) for i in range(5)]
results = [f() for f in funcs]
print(results)
🧠 Почему это важно
Такие баги встречаются:
- в колбэках и ивентах (например, при работе с GUI или CLI)
- в генерации функций внутри циклов
- в async-замыканиях и DSL-интерпретаторах
- в тестовых фреймворках, где создаются сценарии динамически
Понимание области видимости, замыканий и позднего связывания (late binding) — необходимый навык для confident-сеньора.
@python_interview
🐍 Python-совет: используй `functools.lru_cache` для ускорения "дорогих" функций
Если у тебя есть функция, результат которой зависит только от входных данных, — кешируй её! Это может ускорить программы в 10–1000 раз, особенно при рекурсии или повторяющихся запросах.
🔧 Пример:
📌 Что делает
• сохраняет результаты вызова функции
• повторные вызовы с теми же аргументами → мгновенный возврат
•
🔥 Без кеша
⚡ С кешем — менее 1 секунды
🛠️ Применимо к:
• рекурсивным вычислениям
• функциям, вызывающим API
• любым дорогим операциям с неизменяемыми аргументами
🧠 Вывод:
Если у тебя есть функция, результат которой зависит только от входных данных, — кешируй её! Это может ускорить программы в 10–1000 раз, особенно при рекурсии или повторяющихся запросах.
🔧 Пример:
from functools import lru_cache
@lru_cache(maxsize=128)
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
print(fib(100))
📌 Что делает
lru_cache
:• сохраняет результаты вызова функции
• повторные вызовы с теми же аргументами → мгновенный возврат
•
maxsize
ограничивает объём кэша (по принципу LRU — least recently used)🔥 Без кеша
fib(100)
занимает минуты ⚡ С кешем — менее 1 секунды
🛠️ Применимо к:
• рекурсивным вычислениям
• функциям, вызывающим API
• любым дорогим операциям с неизменяемыми аргументами
🧠 Вывод:
@lru_cache
— это одна строка, которая превращает тяжёлую функцию в реактивную. Идеально для оптимизации без изменения логики.Forwarded from Machinelearning
This media is not supported in your browser
VIEW IN TELEGRAM
• Лёгкий и мощный инструмент для разработки в командной строке
• Работает на базе Gemini 2.5 Pro
• Код агента в открытом доступе (Apache 2.0)
• Поддержка контекста в 1 миллион токенов
• Бесплатный тариф: до 60 запросов в минуту и 1000 в день
• Привязка к Google Search
• Поддержка плагинов и скриптов
• Интеграция с VS Code (Gemini Code Assist)
Запуск в cli:
npx https://github.com/google-gemini/gemini-cli
@ai_machinelearning_big_data
#AI #ML #agent #Google
Please open Telegram to view this post
VIEW IN TELEGRAM
Иногда проще показать, как не надо, чем объяснять, как надо.
Вот список «правил», которые помогут вам гарантированно испортить любой Python-проект.
1. 🔒 Используйте непонятные имена переменных
Называйте переменные
x
, y
, a
, thing
. Абстракция — залог путаницы.
def f(x, y, z=None):
a = x * 2
b = y + a if z else y - a
c = [i for i in range(a) if i % 2]
return sum(c) + b
2.🧠 Пихайте максимум логики в одну строку
Сложные тернарные выражения и вложенные list comprehension — всё в одной строке.
result = [x if x > 0 else (y if y < 0 else z) for x in data if x or y and not z]
3.⚠️ Используйте eval() и exec()
Это медленно, небезопасно и глупо — но зато эффектно.
eval("d['" + key + "']")
4.🔁 Переиспользуйте переменные с разными типами
Пусть одна переменная будет и строкой, и числом, и списком — динамическая типизация же!
value = "42"
value = int(value)
value = [value] * value
5.🌍 Используйте глобальные переменные
Изменяйте состояние приложения откуда угодно. Особенно изнутри функций.
counter = 0
def increment():
global counter
counter += 1
6.🔮 Используйте магические числа и строки
Без пояснений. Пусть коллеги гадают, почему именно 42 или "xyz".
if user.role == "xyz" and user.level > 42:
access_granted()
7.📏 Игнорируйте стиль и отступы
Никаких PEP8, никаких правил. Пиши, как хочешь.
def foo():print("start")
if True:
print("yes")
else:
print("no")
8.🧱 Копируйте код из Stack Overflow, не вникая
Ctrl+C — это тоже разработка.
def complex_logic(x):
return (lambda y: (lambda z: z**2)(y + 1))(x)
9.🧩 Придумывайте абстракции без надобности
Вместо простой функции — классы, фабрики и стратегии.
class HandlerFactory:
def get_handler(self):
class Handler:
def handle(self, x): return x
return Handler()
10. 💤 Добавляйте мёртвый код
Никогда не удаляй — вдруг пригодится. И пусть он грузится в каждый запуск.
def legacy_feature():
print("This feature is deprecated")
return
# нигде не вызывается
11.🔀 Не пишите документацию
Комментарии только мешают. Кто захочет — разберётся.
def a(x): return x+1
12.🧪 Пиши без тестов
Если код работает — зачем его проверять?
# Просто запускай и смотри глазами
process_user(data)
13. 🤖 Не используй AI и автодополнение
Только ручной кодинг, без подсказок. Ошибки — путь мастера.
🧠 Заключение
Все эти советы — примеры того, как не стоит писать код.
Если вы узнали себя — пора остановиться. Ведь Python задуман как язык, где важна читаемость, простота и явность.
"Beautiful is better than ugly.
Explicit is better than implicit.
Readability counts."
— The Zen of Python
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM