← Назад к вопросам
Какие ресурсы потребляет программа у компьютера при запуске?
1.2 Junior🔥 71 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Ресурсы, которые потребляет программа при запуске
Программа Python может потреблять различные системные ресурсы. Давайте разберём основные из них и способы их мониторинга.
1. Память (RAM)
Один из критичных ресурсов:
import psutil
import os
from datetime import datetime
# Информация о памяти процесса
process = psutil.Process(os.getpid())
mem_info = process.memory_info()
print(f"RSS (Resident Set Size): {mem_info.rss / 1024 / 1024:.2f} MB")
print(f"VMS (Virtual Memory Size): {mem_info.vms / 1024 / 1024:.2f} MB")
print(f"Процент памяти: {process.memory_percent():.2f}%")
# Информация о системе
system_memory = psutil.virtual_memory()
print(f"\nОбщая память системы: {system_memory.total / 1024 / 1024 / 1024:.2f} GB")
print(f"Используется: {system_memory.used / 1024 / 1024 / 1024:.2f} GB")
print(f"Доступно: {system_memory.available / 1024 / 1024 / 1024:.2f} GB")
print(f"Процент использования: {system_memory.percent}%")
# Отследение утечек памяти
import tracemalloc
tracemalloc.start()
# Код программы
data = [i for i in range(1000000)]
current, peak = tracemalloc.get_traced_memory()
print(f"\nТекущая память: {current / 1024 / 1024:.2f} MB")
print(f"Пиковая память: {peak / 1024 / 1024:.2f} MB")
tracemalloc.stop()
2. CPU (Процессор)
Использование вычислительной мощности:
import psutil
import os
import time
# Информация о CPU
process = psutil.Process(os.getpid())
print(f"CPU cores: {psutil.cpu_count()}")
print(f"CPU физических ядер: {psutil.cpu_count(logical=False)}")
# Использование CPU процессом
print(f"CPU процессом: {process.cpu_num()}")
print(f"Процент CPU процессом: {process.cpu_percent(interval=1)}%")
# Использование CPU системой
print(f"\nОбщее использование CPU: {psutil.cpu_percent(interval=1)}%")
print(f"Использование по ядрам:")
for i, percent in enumerate(psutil.cpu_percent(interval=1, percpu=True)):
print(f" Core {i}: {percent}%")
# Время CPU
print(f"\nВремя в пользовательском режиме: {process.cpu_times().user:.2f}s")
print(f"Время в системном режиме: {process.cpu_times().system:.2f}s")
3. Дисковый ввод-вывод (I/O)
Чтение и запись на диск:
import psutil
import os
process = psutil.Process(os.getpid())
io_info = process.io_counters()
print(f"Прочитано с диска: {io_info.read_bytes / 1024 / 1024:.2f} MB")
print(f"Написано на диск: {io_info.write_bytes / 1024 / 1024:.2f} MB")
print(f"Количество операций чтения: {io_info.read_count}")
print(f"Количество операций записи: {io_info.write_count}")
# Информация о диске
for partition in psutil.disk_partitions():
print(f"\nРаздел: {partition.device}")
try:
usage = psutil.disk_usage(partition.mountpoint)
print(f" Общий размер: {usage.total / 1024 / 1024 / 1024:.2f} GB")
print(f" Использовано: {usage.used / 1024 / 1024 / 1024:.2f} GB")
print(f" Свободно: {usage.free / 1024 / 1024 / 1024:.2f} GB")
print(f" Процент использования: {usage.percent}%")
except PermissionError:
pass
# Скорость I/O
io_counters = psutil.disk_io_counters()
if io_counters:
print(f"\nОбщие I/O операции:")
print(f" Чтений: {io_counters.read_count}")
print(f" Записей: {io_counters.write_count}")
print(f" Прочитано MB: {io_counters.read_bytes / 1024 / 1024:.2f}")
print(f" Написано MB: {io_counters.write_bytes / 1024 / 1024:.2f}")
4. Сетевые ресурсы
Использование сетевых интерфейсов:
import psutil
# Сетевая статистика
net_io = psutil.net_io_counters()
print(f"Отправлено байт: {net_io.bytes_sent / 1024 / 1024:.2f} MB")
print(f"Получено байт: {net_io.bytes_recv / 1024 / 1024:.2f} MB")
print(f"Входящие пакеты: {net_io.packets_recv}")
print(f"Отправленные пакеты: {net_io.packets_sent}")
print(f"Ошибок входящих: {net_io.errin}")
print(f"Ошибок исходящих: {net_io.errout}")
# Информация об интерфейсах
for interface_name, interface_addrs in psutil.net_if_addrs().items():
print(f"\nИнтерфейс: {interface_name}")
for addr in interface_addrs:
print(f" Семейство: {addr.family.name}")
print(f" Адрес: {addr.address}")
print(f" Маска: {addr.netmask}")
# Открытые соединения
for conn in psutil.net_connections(kind='inet'):
if conn.status == 'ESTABLISHED':
print(f"\nСоединение: {conn.laddr} -> {conn.raddr}")
5. Дескрипторы файлов (File Descriptors)
Открытые файлы и сокеты:
import psutil
import os
process = psutil.Process(os.getpid())
# Количество открытых файлов
print(f"Открытых файлов: {len(process.open_files())}")
print(f"Лимит файлов: {process.rlimits()[0][1]}")
# Информация о каждом открытом файле
for open_file in process.open_files():
print(f"Файл: {open_file.path}")
print(f" FD: {open_file.fd}")
print(f" Позиция: {open_file.position}")
# Открытые соединения
for conn in process.net_connections():
print(f"Соединение: {conn.family.name} {conn.type.name}")
print(f" Локальный адрес: {conn.laddr}")
print(f" Удалённый адрес: {conn.raddr}")
print(f" Статус: {conn.status}")
6. Потоки и процессы
Параллельные потоки выполнения:
import psutil
import os
import threading
process = psutil.Process(os.getpid())
# Количество потоков
print(f"Количество потоков: {process.num_threads()}")
print(f"Потоки: {process.threads()}")
# Дочерние процессы
print(f"\nДочерние процессы:")
for child in process.children(recursive=False):
print(f" PID {child.pid}: {child.name()}")
# Рекурсивно
for descendant in process.children(recursive=True):
print(f" Потомок PID {descendant.pid}")
# Информация о потоке
print(f"\nТекущий поток: {threading.current_thread().name}")
print(f"Активных потоков: {threading.active_count()}")
for thread in threading.enumerate():
print(f" {thread.name} (daemon={thread.daemon})")
7. Батарея (для ноутбуков)
import psutil
battery = psutil.sensors_battery()
if battery:
print(f"Уровень батареи: {battery.percent}%")
print(f"Подключено: {battery.power_plugged}")
print(f"Времени на разрядку: {battery.secsleft / 3600:.2f} часов")
else:
print("Батарея не обнаружена")
8. Полная диагностика системы
import psutil
import os
from datetime import datetime
class SystemMonitor:
@staticmethod
def get_full_report():
process = psutil.Process(os.getpid())
report = {
"timestamp": datetime.now().isoformat(),
"memory": {
"rss_mb": process.memory_info().rss / 1024 / 1024,
"vms_mb": process.memory_info().vms / 1024 / 1024,
"percent": process.memory_percent()
},
"cpu": {
"percent": process.cpu_percent(interval=0.1),
"user_time": process.cpu_times().user,
"system_time": process.cpu_times().system,
"num_ctx_switches": process.num_ctx_switches()[0]
},
"io": {
"read_count": process.io_counters().read_count,
"write_count": process.io_counters().write_count,
"read_mb": process.io_counters().read_bytes / 1024 / 1024,
"write_mb": process.io_counters().write_bytes / 1024 / 1024
},
"process": {
"pid": process.pid,
"ppid": process.ppid(),
"num_threads": process.num_threads(),
"num_fds": len(process.open_files()),
"status": process.status(),
"create_time": datetime.fromtimestamp(process.create_time()).isoformat()
},
"system": {
"total_memory_gb": psutil.virtual_memory().total / 1024 / 1024 / 1024,
"used_memory_gb": psutil.virtual_memory().used / 1024 / 1024 / 1024,
"available_memory_gb": psutil.virtual_memory().available / 1024 / 1024 / 1024,
"cpu_count": psutil.cpu_count(),
"cpu_percent": psutil.cpu_percent(interval=0.1),
"boot_time": datetime.fromtimestamp(psutil.boot_time()).isoformat()
}
}
return report
@staticmethod
def print_report():
report = SystemMonitor.get_full_report()
print("\n=== System Monitor Report ===")
print(f"Время: {report['timestamp']}\n")
print("Memory:")
for key, value in report["memory"].items():
print(f" {key}: {value:.2f}")
print("\nCPU:")
for key, value in report["cpu"].items():
print(f" {key}: {value:.2f}")
print("\nI/O:")
for key, value in report["io"].items():
print(f" {key}: {value:.2f}")
print("\nProcess Info:")
for key, value in report["process"].items():
print(f" {key}: {value}")
monitor = SystemMonitor()
monitor.print_report()
9. Типичные ресурсы при запуске Python программы
# Минимальный процесс Python:
# - Память: 10-30 MB
# - CPU: <1% при простое
# - Open files: 10-20 (STDIN, STDOUT, STDERR и т.д.)
# - Threads: 1 (основной поток)
# FastAPI приложение:
# - Память: 50-150 MB (зависит от зависимостей)
# - CPU: 0-5% при простое (зависит от воркеров)
# - Open files: 20-50
# - Threads: 2-4+ (зависит от конфига)
# - Network connections: 1+ (слушание портов)
# Django приложение:
# - Память: 100-300 MB
# - CPU: 1-10% (зависит от load)
# - Open files: 20-100 (БД соединения)
# - Threads: 2-10+
Best Practices для оптимизации
- Профилирование памяти:
from memory_profiler import profile
@profile
def my_function():
big_list = [i for i in range(1000000)]
return sum(big_list)
- Профилирование CPU:
import cProfile
import pstats
profiler = cProfile.Profile()
profiler.enable()
# Код
for i in range(1000000):
pass
profiler.disable()
stats = pstats.Stats(profiler)
stats.sort_stats('cumulative').print_stats(10)
- Мониторинг в production:
import psutil
import logging
logger = logging.getLogger(__name__)
if psutil.virtual_memory().percent > 85:
logger.warning(f"High memory usage: {psutil.virtual_memory().percent}%")
if psutil.cpu_percent(interval=1) > 80:
logger.warning(f"High CPU usage: {psutil.cpu_percent()}%")
Основная задача разработчика - понимать, какие ресурсы потребляет его приложение и оптимизировать их использование в зависимости от требований.