2016-03-17 23 views
6

私は再帰的に呼び出される関数を持っています。私がそれを実行するとエラーが発生する"Pythonオブジェクトの呼び出し中に最大再帰深度を超過しました"Python - mac osxの再帰制限を増やす

Macでの制限をどのように増やすことができますか?私は、次を使用している場合、私は

resource.setrlimit(resource.RLIMIT_STACK, (2**24,-1)) 
sys.setrecursionlimit(10**6) 
+0

これはMacと関係のない[Pythonの制限](http://stackoverflow.com/a/6809586/3872894)かもしれません。 –

+0

リニアスタックの成長ではなく、ログスタックの成長を再帰的に行う可能性を考えましたか?たとえば、リストの最大値を見つけることは、リストの残りの最大値と最大値を比較することによって再帰的に設定できますが、スタックのサイズはリストのサイズに比例して大きくなります。より良い解決策は、リストの前半とリストの後半の最大値を見つけ、その2つのうち大きい方を取ることです。これはあまり仕事はしませんが、リストのサイズで対数的にスタックを増やします。おそらく、あなたの問題は同様に再現される可能性があります。 – pjs

+1

興味深い@pjs、あなたはその事例を偶然持っていますか? – Goodies

答えて

0

私は時代のいくつかの十億の反復可能性を持っていた問題を抱えていた「マックの制限を増やすことはできません」というエラーを取得し、私はそれをやった方法でしたフラット化再帰。この方法が以前に文書化されているかどうかは分かりません。なぜなら、私はそれを見つけ出すのではなく私自身で考え出したからです。あなたが本当にしなければならないのは、各関数のローカル名前空間をリストに入れることだけです。回避策がない場合は、実際のコードを変更する必要があります。しくみはこうだ:

def flatten_a_list(obj):#[[6,5],7,[3,[9,0]]] -> [6,5,7,3,9,0] 
    flattened = [] 
    for item in obj: 
     if type(item) == list: 
      flattened.append(flatten_a_list(item)) 
     else: 
      flattened.append(item) 
    return flattened 

さて、これは伝統的に、再帰的である:

が、私はこの機能を持っていると言います。マインド曲げ

私は作品が細かい書いた機能を、それ:

from copy import deepcopy 

def improved(obj):#[[6,5],7,[3,[9,0]]] -> [6,5,7,3,9,0] 
    flattened = [] 
    position = [0] 
    while True: 
     print('position: {}'.format(str(position))) 
     x = deepcopy(obj) 
     try: 
      for index in position: 
       x = x[index] 
     except (IndexError, TypeError): 
      break 

     if type(x) == list: 
      position.append(0) 
      print('continuing') 
      continue 
     else: 
      flattened.append(x) 

     #Test the next position 
     test = deepcopy(position) 
     test[-1] += 1 
     x = deepcopy(test) 
     print('x: {}'.format(x)) 
     try: 
      y = deepcopy(obj) 
      for index in x: 
       y = y[index] 
      position = deepcopy(test) 
     except (IndexError, TypeError): 
      position = position[:-1] 
      try: 
       position[-1] += 1 
      except IndexError: 
       break 

    return flattened 

二つの言葉を:それは制限なしであるがしかし、多くのネストのために動作するようにそれを作るために、私はこれを行うだろう最適化されていません。スピードが必要な場合は、まず関数を理解してから、コードの 'x'ブロックと 'y'ブロックを取ってインデックスオーバーフローのチェックを組み合わせて、それらをポリモリセーションします。

これをコードに適合させる必要がありますが、理解している限り、あまり問題はありません。プラス、クロスプラットフォームと無制限の答えです。

+1

お気軽に説明してください –

関連する問題