2016-08-05 13 views
0

sagen, ich habe diese Methode, die ich lru_cache-Cache:Python lru_cache Nutzungsoptimierung

@lru_cache(maxsize=8) 
def very_expensive_call(number): 
    # do something that's very expensive 
    return number 

ich diese Methode wie folgt aufrufen:

print([very_expensive_call(i) for i in range(10)]) # call_1 

Da die maxsize des Cache 8, nur Die Nummern 2-9 werden an diesem Punkt zwischengespeichert.

Nach call_1, ich tue call_2:

print([very_expensive_call(i) for i in range(10)]) # call_2 

Während call_2, wieder erste Zahl 0 aufgerufen wird (nicht im Cache!), Und nach, dass die Zahlen 0 und 09.03 zwischengespeichert werden. Dann wird die Nummer 1 aufgerufen (nicht im Cache!) Und danach werden die Nummern 0-1 und 4-9 zwischengespeichert. Nun, sehen Sie, wohin dies geht: Der Cache wird verwendet, nie ...

Ich verstehe, dass für dieses spezielle Beispiel, das ich zwischen range(... und reverse(range(... aber in einem komplizierteren Szenario wechseln könnte, die wahrscheinlich nicht möglich ist.

Frage: Ist es möglich, zu überprüfen, welche Nummern zwischengespeichert werden, und um die Anrufe basierend darauf zu ordnen? Was wäre der Aufwand dafür?

Antwort

1

Nein, nein, die cache, die in lru verwendet wird, wurde speziell entwickelt, um nicht öffentlich zugänglich zu sein. Alle seine Interna are encapsulated für Thread-Sicherheit und um Code nicht zu brechen, wenn die Implementierung ändert.

Abgesehen davon, ich glaube nicht, dass es eine gute Idee ist, Ihre Eingabe basierend auf Caching zu basieren, sollten Sie basierend auf Ihrer Eingabe zwischenspeichern. Wenn Ihre Callable nicht regelmäßig mit denselben Argumenten aufgerufen wird, ist ein Cache möglicherweise nicht die beste Option.

+0

Danke für die Beantwortung. Ich verstehe, dass es gegen die Philosophie von lru_cache ist. Ich denke, dass es in meinem Fall eher ein Optimierungsproblem ist: Als ich entdeckte, dass ich eine Methode immer wieder mit ein paar mehr verschiedenen Argumenten aufruft, kam mein MaxSize und plötzlich der Cache überhaupt nicht mehr zum Einsatz. Wird wahrscheinlich auf zunehmende maxsize zurückgreifen. –