Почему не работает memory_usage из memory_profiler Python?
Пытаюсь измерить потребляемую методом память. Этот метод - поиск подстроки в строке грубой силой.
from memory_profiler import memory_usage
def bruteforce(text, pattern):
for i in range(len(text) - len(pattern) + 1):
x = True
for j in range(len(pattern)):
if text[i + j] != pattern[j]:
x = False
break
if x:
return i
if __name__ == '__main__':
mem_usage = memory_usage(bruteforce('AAAB', 'AB'))
print('Memory usage (in chunks of .1 seconds): %s' % mem_usage)
print('Maximum memory usage: %s' % max(mem_usage))
Но при запуске данного кода возникает ошибка: psutil.NoSuchProcess: psutil.NoSuchProcess no process found with pid 2. Не могу понять, что это значит.
Однако, если запускать код, который ниже, то все работает.
from memory_profiler import memory_usage
from time import sleep
def f():
# a function that with growing
# memory consumption
a = [0] * 1000
sleep(.1)
b = a * 100
sleep(.1)
c = b * 100
return a
if __name__ == '__main__':
mem_usage = memory_usage(f())
print('Memory usage (in chunks of .1 seconds): %s' % mem_usage)
print('Maximum memory usage: %s' % max(mem_usage))
Ответы (2 шт):
Потому, что в документации сказано, что у этой функции есть 2 режима. В формате как вызываете вы она должна мониторить процесс. Ваша функция вернула 2, вот она и пытается найти процесс с id=2.
Чтобы работало с функцией надо передать ей кортеж вида (f, args, kw). Т.е. в вашем случае:
mem_usage = memory_usage((bruteforce, ('AAAB', 'AB'), {}))
После чего получим:
Memory usage (in chunks of .1 seconds): [19.3203125, 19.3203125, 19.3203125]
Maximum memory usage: 19.3203125
В memory usage нужно передавать не результат работы функции, а ее саму.
def a():
return 1
a # function at 0x....
a() # 1
Смотрим офф документацию тык и пишем
from memory_profiler import memory_usage
memory_usage((bruteforce , ('AAAB', 'AB'), {}))