Как измерить насколько та или иная функция загружает процессор?

Заметил что мой скрипт в ходе своего выполнения буквально на 1 секунду повышает загруженность процессора (смотрел в программе FPSMonitor), есть ли способ узнать сколько та или иная функция загружает процессор в момент своего выполнения?


Ответы (2 шт):

Автор решения: Sergey

есть ли способ узнать сколько та или иная функция загружает процессор в момент своего выполнения?

Вопрос не очень корректен. Потому, что нагружают процессор не функции программы, а процессы. И ядро ведёт статистику нагрузки именно по процессам.

Подозреваю, что на самом деле, вас интересует просто вопрос о том, какая из функций Вашей программы жрёт процессорное время больше других функций.

Получить ответ на этот вопрос довольно просто. Предположим, что в Вашей программе работают три функции: F1(), F2() и F3().

Для начала, заведём глобальный хэш:

total = dict(F1=0, F2=0, F3=0) 

После этого, в начале тела кажой функции добавляем строку вида:

timeStart = time.time_ns()

Разумеется, не забываем про import time ! А в конце всех функций добавляем строки вида (это для F1);

timeEnd = time.time_ns()
duration = timeEnd - timeStart
total['F1'] += duration

Ну а в самом конце программы вставляем строчку вида:

print(total)

и анализируем полученные результаты.

→ Ссылка
Автор решения: Andy Pavlov

Измерить загрузку процессора можно с помощью библиотеки psutil.

Через psutil.Process() получаем текущий процесс, через psutil.cpu_count(logical=True) получаем число ядер. Поскольку вычисление ведется на ядро процессора. Через pid.cpu_percent(interval=1.0) получаем загрузку процессора, деля ее на cpu_count.

import threading
import time
import psutil
import random

def test_measure():
    count = 0
    while count < 5:
        tab = [random.randint(0, 1) for _ in range(1000000)]
        s = set(tab)
        count += 1
    return s & s

if __name__ == '__main__':
    t1 = threading.Thread(target=test_measure)
    t1.start()
    pid = psutil.Process()
    time_end = time.time() + 20  # + 20 seconds
    cpu_count = psutil.cpu_count(logical=True)
    while time.time() < time_end:
        print(pid.cpu_percent(interval=1.0)/cpu_count)
    t1.join()
→ Ссылка