Normalmente utilizzi la memoizzazione in cui hai stabilito che il problema che la tua funzione sta tentando di risolvere ha una sottostruttura ottimale. Ciò significa che il problema più grande può essere risolto correttamente in una serie di sottoproblemi di piccole dimensioni. Sembra che tu abbia avuto successo nel realizzarlo e che lo hai risolto in modo ricorsivo, che è anche un modo per suddividere un grosso problema in sottoproblemi.
Se si dispone di codice funzionante e soddisfa tutti i requisiti, compresi i requisiti non funzionali su prestazioni e scalabilità, non è necessario necessariamente migliorare le prestazioni del codice utilizzando la memoizzazione. Ritardare il rilascio di software funzionante per ottimizzare è in genere lo spirito di "Evitare l'ottimizzazione prematura" a mio modesto parere.
Would it be dangerous to use lru_cache() from now?
Dipende da come definisci il pericolo. Se si dispone di una soluzione ricorsiva funzionante senza memoization, l'unico vero pericolo qui è forse l'aggiunta di una maggiore complessità che aumenta il rischio di introdurre un bug nella logica. L'altro rischio è che si potrebbe ritardare il rilascio del software per lavorare su un'ottimizzazione che non è necessaria sulla base di requisiti non funzionali chiaramente definiti.
Potrei anche obiettare che se hai una funzione ricorsiva a lungo termine allora potrebbe esserci un pericolo nel NON usare la memoizzazione!
Ciò che intendo è che per un set di dati sufficientemente grande si corre il rischio di far saltare la pila o di esaurire la memoria. Dovresti fare un test di stress adeguato per assicurarti che la tua soluzione ricorsiva sia a posto.
Should I not care at all about which pieces of my code can be optimized (even if they are obvious to spot, and easy to optimize)?
Se si tratta di una facile ottimizzazione, allora con tutti i mezzi per farlo. L'evasione anticipata dell'ottimizzazione non è tanto una regola dura e veloce, quanto una guida per la vita di uno sviluppatore. È ispirato da alcune altre linee guida soggettive come YAGNI e KISS.
Should I ignore memoization on obvious cases completely, or perhaps note it (e.g. #TODO comments) so that it's easier later on when time for optimization comes?
Assolutamente. Penso che i TODO siano un ottimo modo per lasciare poco spazio a te stesso e agli altri sviluppatori su dove qualcosa potrebbe essere migliorato o fatto meglio. Anche questa è una questione di preferenza personale. Gli sviluppatori di Pro-TODO e Anti-TODO hanno però opinioni molto forti su entrambi i lati e sono entrambi positivi.