SqlAlchemy-Optimierungen für schreibgeschützte Objektmodelle

8

Ich habe ein komplexes Netzwerk von Objekten, die aus einer SQLite-Datenbank mit Hilfe von sqlalchemy ORM-Mappings erzeugt werden. Ich habe ziemlich viele tief verschachtelt:

%Vor%

Mein Profil zeigt mir, dass die sqlalchemy-Instrumentierung in diesem Anwendungsfall viel Zeit in Anspruch nimmt.

Die Sache ist: Ich ändere niemals das Objektmodell (gemappte Eigenschaften) zur Laufzeit, also brauche ich, sobald sie geladen sind, die Instrumentierung oder überhaupt keinen sqlalchemy Overhead. Nach vielen Nachforschungen denke ich, dass ich einen 'reinen Python'-Satz von Objekten aus meinen bereits geladenen' instrumentierten Objekten 'klonen muss, aber das wäre ein Schmerz.

Die Leistung ist hier wirklich entscheidend (es ist ein Simulator), also wäre es vielleicht am besten, diese Schichten als C-Erweiterungen zu schreiben, die sqlite api direkt verwenden. Irgendwelche Gedanken?

    
CarlS 23.02.2010, 23:01
quelle

3 Antworten

7

Wenn Sie mehrfach auf ein einzelnes Attribut einer einzelnen Instanz verweisen, besteht ein einfacher Trick darin, es in einer lokalen Variablen zu speichern.

Wenn Sie eine Möglichkeit haben möchten, billige reine Python-Klone zu erstellen, teilen Sie das dict-Objekt mit dem ursprünglichen Objekt:

%Vor%

Das Erstellen einer solchen Kopie kostet ungefähr die Hälfte des instrumentierten Attributzugriffs und die Attributsuche ist so schnell wie normal.

Es kann auch eine Möglichkeit geben, dass der Mapper Instanzen einer uninstrumentierten Klasse anstelle der instrumentierten Klasse erstellt. Wenn ich etwas Zeit habe, schaue ich mir an, wie tief verwurzelt die Annahme ist, dass bevölkerte Instanzen vom selben Typ sind wie die instrumentierte Klasse.

Ich fand einen schnellen und schmutzigen Weg, der bei 0.5.8 und 0.6 zumindest etwas funktioniert. Getestet wurde es nicht mit Vererbung oder anderen Features, die schlecht interagieren könnten. Auch dies berührt einige nicht-öffentliche APIs, also hüte dich vor Bruch beim Ändern von Versionen.

%Vor%

Anwendungsbeispiel:

%Vor%     
Ants Aasma 24.02.2010, 02:27
quelle
0

Sie sollten in der Lage sein, das verzögerte Laden der fraglichen Beziehungen zu deaktivieren, und sqlalchemy holt sie alle in einer einzigen Abfrage.

    
Travis Bradshaw 24.02.2010 01:47
quelle
-1

Versuchen Sie es mit einer einzigen Abfrage mit JOINs anstelle der Python-Schleifen.

    
ebo 23.02.2010 23:06
quelle