Жадные алгоритмы полезны для решения задач оптимизации, делая ряд локально оптимальных выборов, которые приводят к глобально оптимальному решению. На каждом шаге они выбирают наилучший доступный вариант, не принимая во внимание последствия будущих выборов. Хотя они не гарантируют абсолютно наилучшего решения, они часто предоставляют быстрые и приемлемые решения.
def fractional_knapsack(items, capacity):
# Sort items by their value-to-weight ratio in descending order
items.sort(key=lambda x: x[1] / x[0], reverse=True)
total_value = 0
remaining_capacity = capacity
for item in items:
if remaining_capacity >= item[0]:
total_value += item[1]
remaining_capacity -= item[0]
else:
total_value += (remaining_capacity / item[0]) * item[1]
break
return total_value
# Example usage:
items = [(2, 10), (3, 5), (5, 15), (7, 7), (1, 6)]
knapsack_capacity = 10
max_value = fractional_knapsack(items, knapsack_capacity)
print(max_value)
В этом примере мы используем жадный алгоритм для решения задачи о дробном рюкзаке. Учитывая набор элементов с весами и значениями, цель состоит в том, чтобы выбрать элементы, чтобы максимизировать общую стоимость, не превышая при этом определенный предел веса (емкость рюкзака). Алгоритм сортирует элементы по соотношению их стоимости к весу и выбирает элементы жадно, максимизируя общую стоимость в пределах ограничения емкости.
Жадные алгоритмы особенно полезны, когда проблема демонстрирует свойство жадного выбора, что означает, что локально оптимальный выбор на каждом шаге приводит к глобально оптимальному решению. Однако важно отметить, что не все проблемы можно решить оптимально с помощью жадного подхода, поэтому требуется тщательный анализ, чтобы определить, когда целесообразно использовать этот метод.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
И все это за 5 минут и бесплатно? Вот решение!
https://youtu.be/4jxMhmVGFt0
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Бесплатный хостинг для сайта на Python | Flask и html
В этом видео мы напишем сайт на языке Python и загрузим его на бесплатный хостинг pythonanywhere. Использовать будем библиотеку Flask, а так же подключим к странице html файл, который будет отображаться на нашем хостинге.
🔥 Подписывайся на наш Телеграм-канал…
🔥 Подписывайся на наш Телеграм-канал…
👍2❤1
👍4
Лямбда-функции в Python — это мощный инструмент для создания небольших анонимных функций "на лету". Они особенно полезны для коротких, простых операций, где полное определение функции было бы излишним.
Лямбда-функции определяются с помощью ключевого слова
lambda, в отличие от обычных функций, которые определяются с помощью def. Они позволяют писать более чистый и читаемый код, устраняя необходимость во временных определениях функций.lambda arguments: expression
Например, простая лямбда-функция для сложения двух чисел:
add = lambda x, y: x + y
result = add(3, 5)
print(result) # Выведет: 8
1. С функцией map()
map() применяет функцию к каждому элементу итерируемого объекта:numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, numbers))
print(squared) # Выведет: [1, 4, 9, 16]
2. С функцией filter()
filter() используется для фильтрации элементов:numbers = [1, 2, 3, 4]
even = list(filter(lambda x: x % 2 == 0, numbers))
print(even) # Выведет: [2, 4]
3. С функцией sorted()
sorted() позволяет сортировать элементы по заданному критерию:points = [(1, 2), (3, 1), (5, -1)]
points_sorted = sorted(points, key=lambda point: point[1])
print(points_sorted) # Выведет: [(5, -1), (3, 1), (1, 2)]
- Краткость и читаемость для простой логики
- Расширенные возможности функционального программирования
- Удобны для "одноразовых" функций
- Могут быть сложны для чтения при использовании в сложных выражениях
- Ограничения в обработке ошибок и отладке
- Ограниченная функциональность (только одно выражение)
nested_lambda = lambda x: (lambda y: y ** 2)(x) + 1
print(nested_lambda(3)) # Выведет: 10
Пример использования с Pandas:
import pandas as pd
data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
df = pd.DataFrame(data)
df['C'] = df.apply(lambda row: row['A'] + row['B'], axis=1)
print(df)
Лямбда-функции в Python — мощный инструмент для создания кратких, анонимных функций. При правильном использовании они могут значительно улучшить читаемость и эффективность кода. Однако важно помнить об их ограничениях и использовать их разумно, в соответствии с лучшими практиками программирования.
Источник: Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤🔥1
SWE-Kit представляет собой headless IDE с такими функциями, как LSP (Language Server Protocol), индексация кода и Code RAG (Retrieval-Augmented Generation). Он предлагает гибкую среду выполнения, которая может работать на любом хосте Docker или удаленном сервере, а также специализированные наборы инструментов для кодирования.
- Интеграция с платформами GitHub, Jira и Slack
- Инструменты поиска файлов и индексации кода
- Совместимость с фреймворками LLM, такими как LangChain, CrewAI, Autogen и LlamaIndex
pip install compsio-core swekit
pip install crewai composio-crewai
composio add github
swekit scaffold crewai -o swe_agent
cd swe_agent/agent
python main.py
SWE-Kit позволяет создавать и развертывать собственные агенты, такие как GitHub PR Agent для автоматизации проверки Pull Request, агент SWE для автоматического написания функций, модульных тестов и документации, а также инструмент для чата с кодовой базой.
Aider - это идеальный выбор для тех, кто ищет виртуального парного программиста. Он позволяет связать программы с моделями машинного обучения (LLM) для редактирования кода в вашем локальном репозитории GitHub.
pip install aider-chat
cd /to/your/git/repo
export ANTHROPIC_API_KEY=your-key-goes-here
aider
# Или для работы с GPT-4
export OPENAI_API_KEY=your-key-goes-here
aider
Mentat - это инструмент на основе ИИ, призванный помочь разработчикам справиться с любой задачей по написанию кода из командной строки. В отличие от других инструментов, Mentat может координировать правки в нескольких файлах и понимает контекст проекта с самого начала.
python3 -m venv .venv
source .venv/bin/activate
git clone https://github.com/AbanteAI/mentat.git
cd mentat
pip install -e .
export OPENAI_API_KEY=<your key here>
mentat <paths to files or directories>
AutoCodeRover предлагает полностью автоматизированное решение для устранения проблем GitHub, включая исправление ошибок и добавление функций. Он объединяет LLM с расширенными возможностями анализа и отладки для эффективного создания и внедрения исправлений.
export OPENAI_KEY=sk-YOUR-OPENAI-API-KEY-HERE
docker build -f Dockerfile -t acr .
docker run -it -e OPENAI_KEY="${OPENAI_KEY:-OPENAI_API_KEY}" -p 3000:3000 -p 5000:5000 acr
Источник: Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Continue похож на популярную среду IDE Cursor, но имеет открытый исходный код под лицензией Apache. Он очень настраиваемый и позволяет добавлять любую языковую модель для автодополнения или чата.
- Общение в чате для понимания и переработки кода в боковой панели
- Автозаполнение для получения встроенных предложений кода по мере ввода текста
- Редактирование кода без необходимости покидать текущий файл
- Действия по созданию ярлыков для повседневных случаев использования
Qodo Merge - это инструмент с открытым исходным кодом от Codium AI, который автоматизирует обзор, анализ, обратную связь и предложения для запросов на извлечение GitHub. Он совместим с другими системами контроля версий, такими как GitLab и BitBucket.
pip install pr-agent
from pr_agent import cli
from pr_agent.config_loader import get_settings
def main():
provider = "github"
user_token = "..."
openai_key = "..."
pr_url = "..."
command = "/review"
get_settings().set("CONFIG.git_provider", provider)
get_settings().set("openai.key", openai_key)
get_settings().set("github.user_token", user_token)
cli.run_command(pr_url, command)
if __name__ == '__main__':
main()
OpenHands - одна из ведущих платформ с открытым исходным кодом для агентов ИИ. Агент OpenHands может создавать новые проекты с нуля, добавлять функции в существующие кодовые базы, отлаживать проблемы и многое другое.
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.12-nikolaik
docker run -it --rm --pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.12-nikolaik \
-v /var/run/docker.sock:/var/run/docker.sock \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.12
После запуска OpenHands будет доступен по адресу http://localhost:3000/.
Cody - это проект с открытым исходным кодом от Sourcegraph, призванный ускорить ваш рабочий процесс кодирования непосредственно в вашей IDE. Он использует расширенный поиск в качестве помощника по кодированию для извлечения контекста из локальных и удаленных кодовых баз.
- Общение с базой кода
- Внесение встроенных правок
- Получение предложений по коду
- Автодополнение
VannaAI - это инструмент с открытым исходным кодом, позволяющий общаться с базами данных SQL, используя естественный язык. Он особенно полезен для тех, кто испытывает трудности с написанием SQL-запросов.
pip install vanna
from vanna.openai.openai_chat import OpenAI_Chat
from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore
class MyVanna(ChromaDB_VectorStore, OpenAI_Chat):
def __init__(self, config=None):
ChromaDB_VectorStore.__init__(self, config=config)
OpenAI_Chat.__init__(self, config=config)
vn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})
# Обучение модели
vn.train(ddl="""
CREATE TABLE IF NOT EXISTS my-table (
id INT PRIMARY KEY,
name VARCHAR(100),
age INT
)
""")
# Задать вопрос
sql_query = vn.ask("What are the top 10 customers by sales?")
print(sql_query)
Источник: Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Привет, питонисты! Сегодня поговорим об асинхронных генераторах — фиче, которая может серьёзно прокачать ваш код. Но для начала давайте разберёмся, что это за зверь такой.
Представьте обычный генератор, но на стероидах. Асинхронный генератор — это функция, которая использует async def и yield для создания асинхронного итератора. Звучит сложно? На самом деле, это просто способ лениво создавать последовательность значений, не блокируя основной поток выполнения.
Асинхронные генераторы особенно полезны, когда вы работаете с I/O-bound задачами. Например, при обработке больших объёмов данных из сети или файловой системы. Они позволяют эффективно управлять памятью и повышают отзывчивость приложения.
async def async_range(start, stop):
for i in range(start, stop):
await asyncio.sleep(0.1)
yield i
async def main():
async for num in async_range(0, 5):
print(num)
asyncio.run(main())
В этом примере async_range имитирует долгую операцию с помощью asyncio.sleep. В реальном коде вместо sleep могла бы быть работа с базой данных или API.
1. Парсинг данных: Представьте, что вам нужно обработать гигабайты логов. Асинхронный генератор позволит читать и обрабатывать данные порциями, не загружая всё в память разом.
2. Стриминг данных: При работе с потоковым API вы можете использовать асинхронный генератор для обработки данных по мере их поступления.
3. Пагинация: Если вы работаете с API, которое возвращает данные постранично, асинхронный генератор может абстрагировать логику пагинации, предоставляя удобный интерфейс для работы с данными.
Помните, что асинхронные генераторы работают только внутри асинхронного кода. Их нельзя использовать в синхронных функциях. Кроме того, они могут быть сложнее для понимания и отладки, особенно для новичков в асинхронном программировании.
Источник: Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰3👍1
Привет, питонисты! Сегодня мы нырнем в глубины Python и раскопаем настоящие жемчужины — нестандартные способы использования декораторов. Держитесь крепче, будет интересно!
Помните, как вы впервые узнали о декораторах? Наверняка это было что-то вроде @staticmethod или простенького таймера. Но, друзья мои, это лишь верхушка айсберга! Давайте посмотрим, как можно выжать из декораторов все соки.
import functools
def spy_args(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"Вызов {func.__name__} с аргументами: {args}, {kwargs}")
return func(*args, **kwargs)
return wrapper
@spy_args
def секретная_функция(x, y, шифр="007"):
return x + y
результат = секретная_функция(3, 4, шифр="008")
Этот хитрый декоратор не просто логирует вызовы, он позволяет отслеживать все входящие аргументы. Представьте, как это может пригодиться при отладке сложных систем!
def to_json(func):
import json
@functools.wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return json.dumps(result)
return wrapper
@to_json
def получить_данные():
return {"имя": "Алиса", "возраст": 30}
json_data = получить_данные()
Этот декоратор автоматически сериализует результат в JSON. Удобно, правда? Особенно когда вы работаете с API и вам нужно гарантировать формат ответа.
def применить_все(*funcs):
def декоратор(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
result = f(*args, **kwargs)
for func in funcs:
result = func(result)
return result
return wrapper
return декоратор
def удвоить(x): return x * 2
def прибавить_один(x): return x + 1
@применить_все(удвоить, прибавить_один)
def базовая_функция(x):
return x
результат = базовая_функция(10) # Вернёт 21
Этот монстр позволяет применить целую цепочку функций к результату. Представьте, как это может упростить обработку данных в сложных потоках!
class Ленивый:
def __init__(self, function):
self.function = function
self.результат = None
def __call__(self, *args, **kwargs):
if self.результат is None:
self.результат = self.function(*args, **kwargs)
return self.результат
@Ленивый
def сложные_вычисления():
print("Выполняю сложные вычисления...")
return 42
результат = сложные_вычисления() # Вычисления выполняются
результат = сложные_вычисления() # Используется кэшированный результат
Этот декоратор позволяет отложить выполнение функции до момента первого вызова, а затем кэширует результат. Идеально для оптимизации производительности!
Заключение: декораторы — ваш секретный ингредиент
Источник: Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Debug в Python | Используйте ic() вместо print()
Сегодня мы рассмотрим библиотеку icecream для языка Python, которая позволяет дебажить ваш код проще и быстрее, чем через команду print(). Просто используй функцию ic() и твой debugging станет лучше.
🔥 Подписывайся на наш Телеграм-канал про Python 🔥
🖇 …
🔥 Подписывайся на наш Телеграм-канал про Python 🔥
🖇 …
👍2
Привет, питонисты! Сегодня мы погрузимся в мир профилирования и оптимизации памяти в Python. Держите ваши кружки с кофе наготове — будет интересно!
❗️ Зачем вообще париться с памятью в Python?
Казалось бы, Python — язык высокого уровня с автоматическим управлением памятью. Зачем нам вообще беспокоиться об этом? Но, друзья мои, даже в Пайтоне память не бесконечна. Особенно когда вы работаете с большими данными или создаете высоконагруженные приложения.
❗️ memory_profiler: ваш верный спутник
memory_profiler — это как швейцарский нож для анализа памяти. Вот пример его использования:
Запустите скрипт с помощью
❗️ line_profiler: когда нужна точность до строчки
Если memory_profiler — это швейцарский нож, то line_profiler — это микроскоп. Он покажет вам использование памяти построчно:
Запустите с помощью
❗️ objgraph: визуализируем объекты
objgraph — это как рентген для вашего кода. Он позволяет визуализировать объекты в памяти:
Запустите это, и вы получите красивую картинку связей между объектами. Полезно для поиска утечек памяти!
❗️ tracemalloc: встроенная мощь Python
А теперь — жемчужина в короне Python 3. tracemalloc — это встроенный модуль для отслеживания выделения памяти:
Это как рентген, МРТ и УЗИ в одном флаконе. Вы увидите, где именно происходят утечки памяти.
Источник: Python Hub - сборище Питонистов👩💻
Казалось бы, Python — язык высокого уровня с автоматическим управлением памятью. Зачем нам вообще беспокоиться об этом? Но, друзья мои, даже в Пайтоне память не бесконечна. Особенно когда вы работаете с большими данными или создаете высоконагруженные приложения.
memory_profiler — это как швейцарский нож для анализа памяти. Вот пример его использования:
from memory_profiler import profile
@profile
def my_func():
a = [1] * (10 ** 6)
b = [2] * (2 * 10 ** 7)
del b
return a
if __name__ == '__main__':
my_func()
Запустите скрипт с помощью
python -m memory_profiler script.py, и вы увидите подробный отчет о использовании памяти. Красота, правда?Если memory_profiler — это швейцарский нож, то line_profiler — это микроскоп. Он покажет вам использование памяти построчно:
@profile
def my_func():
a = [1] * (10 ** 6)
b = [2] * (2 * 10 ** 7)
del b
return a
my_func()
Запустите с помощью
kernprof -l -v script.py, и вы увидите, какая строчка сколько памяти съедает.objgraph — это как рентген для вашего кода. Он позволяет визуализировать объекты в памяти:
import objgraph
x = []
y = [x, [x], dict(x=x)]
objgraph.show_refs([y], filename='sample-graph.png')
Запустите это, и вы получите красивую картинку связей между объектами. Полезно для поиска утечек памяти!
А теперь — жемчужина в короне Python 3. tracemalloc — это встроенный модуль для отслеживания выделения памяти:
import tracemalloc
tracemalloc.start()
# ваш код здесь
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
print("[ Топ 10 ]")
for stat in top_stats[:10]:
print(stat)
Это как рентген, МРТ и УЗИ в одном флаконе. Вы увидите, где именно происходят утечки памяти.
Источник: Python Hub - сборище Питонистов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Сейчас у Hostetski крутая акция — это ваш шанс воспользоваться отличным сервисом по выгодной цене!
Узнайте все подробности тут 👉 Акция от Hostetski
Не упустите шанс вывести свои проекты на новый уровень с топовым хостингом!
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Новости Hostetski:)
1️⃣1️⃣.1️⃣1️⃣Горячая распродажа и выгода до 50%
Настала пора уже нашей традиционной, 4-ой по счету распродажи. Мы знаем, что среди вас есть те, кто оплачивают все эти года наши услуги целенапрвленно в эти числа, и уже с лета мучают поддержку вопросами, будет…
Настала пора уже нашей традиционной, 4-ой по счету распродажи. Мы знаем, что среди вас есть те, кто оплачивают все эти года наши услуги целенапрвленно в эти числа, и уже с лета мучают поддержку вопросами, будет…
❤2👍2
Библиотека functools в Python - это настоящая сокровищница для разработчиков, стремящихся оптимизировать свой код и расширить функциональные возможности языка. Хотя многие знакомы с такими популярными инструментами, как @lru_cache и partial, эта библиотека скрывает ряд менее известных, но не менее полезных функций.
reduce() - это функция, которая применяет указанную функцию к итерируемому объекту, последовательно сводя его к единственному значению. Это мощный инструмент для обработки последовательностей данных, особенно когда нужно выполнить кумулятивные операции.
Пример использования:
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product) # Выведет: 120
@singledispatch позволяет создавать функции, которые ведут себя по-разному в зависимости от типа переданного аргумента. Это элегантная альтернатива множественным условным операторам.
from functools import singledispatch
@singledispatch
def process(arg):
print(f"Обработка объекта: {arg}")
@process.register(int)
def _(arg):
print(f"Обработка целого числа: {arg}")
@process.register(list)
def _(arg):
print(f"Обработка списка длиной {len(arg)}")
process("строка") # Обработка объекта: строка
process(42) # Обработка целого числа: 42
process([1, 2, 3]) # Обработка списка длиной 3
Декоратор @total_ordering значительно упрощает реализацию классов, поддерживающих операции упорядочивания. Достаточно определить методы eq() и один из методов сравнения (lt, le, gt или ge), а остальные будут автоматически созданы.
from functools import total_ordering
@total_ordering
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return self.age == other.age
def __lt__(self, other):
return self.age < other.age
p1 = Person("Алиса", 25)
p2 = Person("Боб", 30)
print(p1 < p2) # True
print(p1 <= p2) # True
print(p1 > p2) # False
print(p1 >= p2) # False
Функция cache предоставляет простой способ кэширования результатов функции без ограничения размера кэша. Это может быть полезно, когда вы уверены, что количество уникальных входных данных ограничено.
from functools import cache
@cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(100)) # Мгновенный результат даже для больших чисел
Декоратор @wraps помогает сохранить метаданные оригинальной функции при создании декораторов. Это особенно важно при использовании инструментов документации и отладки.
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
"""Это документация обертки"""
print("До вызова функции")
result = func(*args, **kwargs)
print("После вызова функции")
return result
return wrapper
@my_decorator
def say_hello(name):
"""Приветствует пользователя по имени"""
print(f"Привет, {name}!")
say_hello("Мария")
print(say_hello.__name__) # Выведет: say_hello
print(say_hello.__doc__) # Выведет: Приветствует пользователя по имени
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
В Python все является объектом, даже сами классы. Это открывает перед нами удивительные возможности для создания динамических структур кода. Давайте погрузимся в мир создания классов и функций "на лету" с помощью type() и метаклассов.
Функция type() в Python - это не просто инструмент для определения типа объекта. Она также может быть использована для создания новых классов динамически. Вот простой пример:
MyClass = type('MyClass', (), {'x': 42, 'my_method': lambda self: print("Hello!")})
obj = MyClass()
print(obj.x) # Выведет: 42
obj.my_method() # Выведет: Hello!Здесь мы создали класс MyClass с атрибутом x и методом my_method. Удивительно, правда?
Метаклассы - это классы классов. Они позволяют нам контролировать процесс создания классов. Рассмотрим пример:
class MyMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['additional_method'] = lambda self: print("I'm additional!")
return super().__new__(cls, name, bases, attrs)
class MyClass(metaclass=MyMetaclass):
pass
obj = MyClass()
obj.additional_method() # Выведет: I'm additional!
В этом примере мы создали метакласс, который добавляет новый метод ко всем классам, использующим его.
Динамическое создание классов и функций может быть полезно в различных сценариях:
- Фабрики классов: создание классов на основе внешних данных или конфигурации.
- Декораторы классов: модификация классов без изменения их исходного кода.
- ORM (Object-Relational Mapping): динамическое создание классов на основе структуры базы данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Кто вообще работает с логами?
Поделитесь в комментах. А кто нет, тот пусть учится.
https://youtu.be/RpQXC9aelDc
Поделитесь в комментах. А кто нет, тот пусть учится.
https://youtu.be/RpQXC9aelDc
YouTube
Логирование в Python | Loguru - лучшее решение
В этом видео мы разберемся, как работать с логами в Python. А именно разберем это на примере специальной библиотеки для логгирования - Loguru.
🔥 Подписывайся на наш Телеграм-канал про Python 🔥
🖇 https://t.me/pythonhub001 🖇
💻 Не только Python! Канал о технологиях!…
🔥 Подписывайся на наш Телеграм-канал про Python 🔥
🖇 https://t.me/pythonhub001 🖇
💻 Не только Python! Канал о технологиях!…
❤3
Сейчас у Hostetski крутая акция — это ваш шанс воспользоваться отличным сервисом по выгодной цене!
Узнайте все подробности тут 👉 Акция от Hostetski
Не упустите шанс, ведь это последние дни акции!
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Новости Hostetski:)
1️⃣1️⃣.1️⃣1️⃣Горячая распродажа и выгода до 50%
Настала пора уже нашей традиционной, 4-ой по счету распродажи. Мы знаем, что среди вас есть те, кто оплачивают все эти года наши услуги целенапрвленно в эти числа, и уже с лета мучают поддержку вопросами, будет…
Настала пора уже нашей традиционной, 4-ой по счету распродажи. Мы знаем, что среди вас есть те, кто оплачивают все эти года наши услуги целенапрвленно в эти числа, и уже с лета мучают поддержку вопросами, будет…
👍3❤1
Представьте, что ваше приложение – это кухня в популярном ресторане. В синхронном мире у вас один шеф-повар, готовящий блюда по очереди. С asyncio у вас целая команда виртуозов, жонглирующих сковородками и готовящих несколько блюд одновременно. Вот это производительность! 👨🍳👩🍳
1. 🏎 Выбор правильного event loop – это как выбор двигателя для вашего болида. Для Linux-систем рекомендую uvloop – он может разогнать ваше приложение до космических скоростей:
import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
1. 🧵 Настройка пула потоков – это как добавление турбонаддува. Используйте его для тяжелых, блокирующих операций:
loop = asyncio.get_event_loop()
loop.set_default_executor(concurrent.futures.ThreadPoolExecutor(max_workers=10))
1. 🚦 Семафоры – ваши верные регулировщики трафика. Они помогут контролировать конкурентность и избежать перегрузок:
sem = asyncio.Semaphore(10)
async def controlled_task(i):
async with sem:
# Ваш асинхронный код здесь
await asyncio.sleep(1)
print(f"Задача {i} выполнена!")
🌪 Замените requests на aiohttp для HTTP-запросов. Это как пересесть с велосипеда на реактивный самолет – скорость поразит ваше воображение!
💾 Используйте aiomysql или asyncpg для работы с базами данных. Ваши запросы будут молниеносными, словно Усэйн Болт на стометровке!
🔬 Профилируйте код с помощью cProfile или yappi. Найдите узкие места и оптимизируйте их, как настоящий хирург производительности.
🥷 Используйте асинхронные контекстные менеджеры для элегантной обработки ресурсов:
class AsyncContextManager:
async def __aenter__(self):
print("Entering the matrix...")
await asyncio.sleep(1)
return self
async def __aexit__(self, exc_type, exc, tb):
print("Exiting the matrix...")
await asyncio.sleep(1)
async def main():
async with AsyncContextManager() as manager:
print("We're in!")
🎭 Не забывайте про асинхронные генераторы – они могут творить настоящие чудеса в потоковой обработке данных:
async def async_range(start, stop):
for i in range(start, stop):
await asyncio.sleep(0.1)
yield i
async def main():
async for num in async_range(0, 10):
print(num)
Друзья, asyncio – это не просто библиотека, это образ мышления. Освоив его, вы сможете создавать приложения, которые будут работать быстрее, эффективнее и элегантнее. Помните: в мире асинхронного программирования нет ничего невозможного! 🚀
А теперь вопрос к вам, асинхронные гуру: какие еще трюки вы используете для оптимизации asyncio в своих проектах? Поделитесь своими секретами в комментариях!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🍌2❤1
Привет, Питонисты с большой буквы! 👋 Сегодня поговорим о том, как превратить рутину в удовольствие.
Знаете ли вы, что среднестатистический разработчик тратит до 30% рабочего времени на манипуляции с файлами? Шок! 😱 Но не спешите впадать в уныние – Python спешит на помощь!
🐍 Python: ваш верный помощник в джунглях файловой системы
Начнем с того, что Python – это не просто язык, это швейцарский нож для работы с файлами. Библиотека os? Классика жанра! Но давайте копнем глубже.
🔥 Хот-тип: Попробуйте pathlib. Это объектно-ориентированный подход к работе с путями. Вместо склеивания строк – элегантное решение:
from pathlib import Path
downloads = Path.home() / 'Downloads'
for file in downloads.glob('*.pdf'):
print(f"Нашел PDF: {file.name}")
Красиво, правда? 😍 И это только начало!
🧙♂️ Магия автоматизации: от простого к сложному
Теперь давайте создадим что-то более мощное. Представьте: вы фрилансер, и у вас куча проектов. Каждый проект – отдельная папка. А что, если автоматизировать создание структуры проекта?
import os
from pathlib import Path
def create_project_structure(name):
base = Path(name)
folders = ['src', 'tests', 'docs', 'resources']
files = ['README.md', 'requirements.txt', '.gitignore']
for folder in folders:
(base / folder).mkdir(parents=True, exist_ok=True)
for file in files:
(base / file).touch()
print(f"Проект {name} создан! 🎉")
create_project_structure("super_puper_project")
Бум! 💥 Одна функция, и вся структура готова. Сколько времени вы сэкономите? Правильно, тонну!
🕵️♂️ Детектив в мире файлов: поиск дубликатов
А теперь представьте, что вам нужно найти дубликаты файлов. Звучит как квест, не так ли? Но с Python это проще простого:
import hashlib
from collections import defaultdict
def find_duplicates(directory):
hash_map = defaultdict(list)
for path in Path(directory).rglob('*'):
if path.is_file():
file_hash = hashlib.md5(path.read_bytes()).hexdigest()
hash_map[file_hash].append(path)
return {hash: paths for hash, paths in hash_map.items() if len(paths) > 1}
dupes = find_duplicates('/path/to/directory')
for hash, files in dupes.items():
print(f"Найдены дубликаты: {', '.join(str(f) for f in files)}")
Вуаля! 🎩 Теперь вы – настоящий детектив в мире файлов.
🚀 Автоматизация на максималках
Но почему останавливаться на достигнутом? Давайте создадим скрипт, который будет мониторить папку и автоматически сортировать файлы по типам:
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class Sorter(FileSystemEventHandler):
def on_created(self, event):
if not event.is_directory:
file = Path(event.src_path)
dest = file.parent / file.suffix[1:]
dest.mkdir(exist_ok=True)
file.rename(dest / file.name)
print(f"Файл {file.name} перемещен в {dest}")
path = "/path/to/watch"
event_handler = Sorter()
observer = Observer()
observer.schedule(event_handler, path, recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
Теперь ваши файлы будут автоматически сортироваться по папкам.
А какие ваши любимые трюки для работы с файлами? Делитесь в комментариях!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
🚀 Привет, питонисты! Готовы погрузиться в захватывающий мир тестирования параллельного и асинхронного кода? Пристегните ремни, мы отправляемся в путешествие по лабиринтам многопоточности и асинхронности!
Представьте, что ваш код – это оркестр в Мариинском театре. Каждый инструмент (поток или корутина) играет свою партию. А вы – дирижёр, который должен убедиться, что все звучит гармонично. Вот только как это сделать, когда все играют одновременно? 🎵 Давайте разберемся!
Первое правило тестирования параллельного кода: изолируйте тесты! Каждый тест должен быть как отдельная комната в звукоизолированной студии. Используйте моки и стабы, чтобы симулировать внешние зависимости. Вот пример с использованием unittest.mock:
from unittest.mock import patch
import asyncio
async def fetch_data(url):
# Реальный запрос к API
...
@patch('your_module.fetch_data')
async def test_process_data(mock_fetch):
mock_fetch.return_value = {'key': 'value'}
result = await process_data('http://api.example.com')
assert result == 'processed value'
Видите? Мы изолировали тест от реального API. Теперь он быстрый, как Усэйн Болт, и предсказуемый, как восход солнца! 🌅
Асинхронный код может быть непредсказуемым, как погода в Питере. Но ваши тесты должны быть стабильными, как гранитная набережная. Используйте семафоры, события и другие примитивы синхронизации, чтобы контролировать порядок выполнения. Вот пример с использованием asyncio.Event:
import asyncio
async def test_order_of_execution():
event = asyncio.Event()
results = []
async def task1():
await event.wait()
results.append(1)
async def task2():
results.append(2)
event.set()
await asyncio.gather(task1(), task2())
assert results == [2, 1]
Этот тест всегда будет проходить, даже если вы запустите его на компьютере, работающем на картофельной батарейке! 🥔⚡️
⏰ Установка таймаутов в тестах – это как страховка. Вы надеетесь, что она не понадобится, но лучше иметь ее под рукой. Вот как можно использовать таймауты в pytest:
import pytest
import asyncio
@pytest.mark.asyncio
async def test_long_running_task():
with pytest.raises(asyncio.TimeoutError):
await asyncio.wait_for(never_ending_task(), timeout=1.0)
Этот тест убедится, что ваша функция не зависнет, как старый Windows при запуске Crysis! 💻💥
В мире async/await фикстуры тоже должны быть асинхронными. Используйте async fixtures в pytest для подготовки и очистки тестового окружения. Вот пример:
import pytest
import asyncio
@pytest.fixture
async def database():
db = await create_database_connection()
yield db
await db.close()
@pytest.mark.asyncio
async def test_database_query(database):
result = await database.fetch('SELECT * FROM users')
assert len(result) > 0
Эта фикстура – как заботливая мама, которая готовит завтрак перед школой и убирает посуду после. Только вместо завтрака у нас база данных! 🍳🏫
🏎 Запуск тестов параллельно не только ускоряет процесс, но и помогает выявить проблемы с состоянием гонки. Используйте pytest-xdist, но будьте осторожны: убедитесь, что ваши тесты действительно независимы друг от друга. Вот команда для запуска:
pytest -n auto your_test_file.py
Это как устроить гонки Формулы-1 для ваших тестов. Победит самый быстрый и надежный код! 🏁
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2