2014-12-19 6 views
3

Я имею здесь рекурсивную функцию:Рекурсивные функции использования памяти

def pow(x, n): 
    if n == 0: 
     return 1 
    else: 
     return x * pow(x, n-1) 
answer = pow(a, b) 

И Итерационный:

def pow(x, n): # n != 0 
    answer = x 
    while n > 1: 
     answer *= x 
     n -= 1 
    return answer 
answer = pow(a, b) 

Я хотел бы знать, какая из них больше памяти. Я думаю, что рекурсивно использует больше памяти, потому что он сохраняет «переменные» для каждого вызова функции. Если это так, что будет формализмом, чтобы объяснить это? Есть ли хороший способ отслеживать использование этой памяти внутри кода?


Я не думаю, что это дубликат. Главный вопрос заключается не в отслеживании использования памяти, а в том, что касается использования рекурсивной памяти.

+1

Вы пытались использовать профайлер памяти? – jonrsharpe

+0

Я читал о Guppy-PE, но мне не очень понравилось, как его использовать. –

+2

неверное ваше итерационное решение. –

ответ

3

Здесь нет формализма.

Python рамы штабеля огромный.

Ваш рекурсивный код использует намного больше памяти.

Типичный кадр стека CPython содержит более 50 элементов плюс локальные переменные, в качестве примера используется архитектура x86_64, это почти 500 байт.

In [1]: import inspect 

In [2]: inspect.stack()[1][0] 
Out[2]: <frame at 0x7fed81c86850> 

In [3]: inspect.stack()[1][0].__sizeof__() 
Out[3]: 472 

Хорошее сообщение о содержании кадров: http://tech.blog.aknin.name/2010/07/22/pythons-innards-interpreter-stacks/

+1

Veery приятно. Благодаря! –

Смежные вопросы