2014-12-19 47 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 2014-12-19 11:14:12

+0

我讀到顧比-PE,但我並沒有得到很好的如何使用它。 – 2014-12-19 11:16:03

+2

您的迭代解決方案不正確。 – 2014-12-19 11:16:41

回答

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

很好。謝謝! – 2014-12-19 12:12:01