2016-03-17 11 views
6

Ho una funzione denominata in modo ricorsivo. Quando lo eseguo viene visualizzato l'errore "superata la profondità massima di ricorsione durante la chiamata a un oggetto Python"Python - Aumentare il limite di ricorsione in mac osx

Come aumentare il limite su mac? Se uso il seguente, ottengo l'errore "non può aumentare il limite su Mac"

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

Questa potrebbe essere una [limitazione Python] (http://stackoverflow.com/a/6809586/3872894), non qualcosa da fare con Mac. –

+0

Hai considerato la possibilità di riscrivere la tua ricorsione per avere una crescita dello stack del log piuttosto che una crescita lineare dello stack? Ad esempio, trovare il massimo di una lista può essere impostato in modo ricorsivo confrontando il massimo fino al massimo del resto della lista, ma lo stack crescerà linearmente nella dimensione della lista. Una soluzione migliore è trovare il massimo della prima metà dell'elenco e la seconda metà dell'elenco, e prendere il più grande di questi due, che non fa meno lavoro ma aumenta lo stack logaritmicamente nella dimensione dell'elenco . Forse il tuo problema può essere riformulato in modo simile. – pjs

+1

Interessante @pjs, ne hai un esempio per caso? – Goodies

risposta

0

Ho avuto un problema in cui ho avuto la possibilità di ricorrenti diversi miliardi di volte, e il modo in cui l'ho fatto è stato di appiattimento la ricorsione. Non so se questo metodo è stato documentato prima, perché l'ho inventato da solo invece di trovarlo. Tutto quello che devi fare è mettere lo spazio dei nomi locale di ogni funzione in un elenco. Ciò richiederà una modifica nel codice effettivo, se non vi è alcuna soluzione alternativa. Ecco come funziona:

Dire che ho questa funzione:

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 

Ora, questo è tradizionalmente ricorsivo. Per fare in modo che esso funzionerà per tuttavia molte nidificazioni sono lì con alcun limite, farei questo:

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 

Due parole: mente flessione

La funzione che ho scritto funziona bene, ma è non è ottimizzato Se si desidera la velocità, assicurarsi innanzitutto di aver compreso la funzione, quindi combinare i controlli di overflow dell'indice prendendo i blocchi di codice 'x' e 'y' che si stanno polimorfizzando.

Dovrai adattare questo codice al tuo codice, ma finché lo capisci, non dovrebbe esserci molto o un problema. Inoltre, la risposta è multi-piattaforma e illimitata.

+1

Per favore sentiti libero di spiegare qualsiasi downvote –