Как измерить насколько та или иная функция загружает процессор?
Заметил что мой скрипт в ходе своего выполнения буквально на 1 секунду повышает загруженность процессора (смотрел в программе FPSMonitor), есть ли способ узнать сколько та или иная функция загружает процессор в момент своего выполнения?
Ответы (2 шт):
есть ли способ узнать сколько та или иная функция загружает процессор в момент своего выполнения?
Вопрос не очень корректен. Потому, что нагружают процессор не функции программы, а процессы. И ядро ведёт статистику нагрузки именно по процессам.
Подозреваю, что на самом деле, вас интересует просто вопрос о том, какая из функций Вашей программы жрёт процессорное время больше других функций.
Получить ответ на этот вопрос довольно просто. Предположим, что в Вашей программе работают три функции: 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)
и анализируем полученные результаты.
Измерить загрузку процессора можно с помощью библиотеки 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()