2 Stimmen

Wie kann man große Datenmengen am effizientesten zwischen Python und C++ austauschen?

Ich schreibe ein System, mit dem Python-Skripte innerhalb einer C++-Anwendung ausgeführt werden können.

Die Python-Skripte werden verwendet, um Werte in Datenfeldern zu ändern (typischerweise 2048x2048x4-Fließkomma-Arrays)

Ich verwende derzeit Numpy-Arrays, die mit der Array-API erstellt und bei Python registriert wurden.

In den Python-Skripten greife ich auf die Arrays zu wie

for all x in range(0,Width):
    for all y in range(0,Height)
        Array[x][y][0] = blah
        Array[x][y][1] = blah
        Array[x][y][2] = blah
        Array[x][y][3] = blah

Das scheint ziemlich langsam zu sein. Gibt es eine schnellere Möglichkeit, dies einzurichten?

1voto

sth Punkte 210180

Schauen Sie doch mal unter Boost.Python . Es konzentriert sich darauf, C++-Code in Python verfügbar zu machen, aber es bietet auch exec- und eval-Funktionen die es Ihnen ermöglichen sollte, effizient mit Python-Code zu interagieren.

1voto

Ned Batchelder Punkte 342778

Ich dachte, ich würde numpy vorschlagen, aber Sie verwenden es bereits. Ich fürchte, das bedeutet, dass domänenspezifische Änderungen weniger Arbeit machen. Wie John Montgomery erwähnt, müssen Sie herausfinden, was die Zeit im Python-Code in Anspruch nimmt, und feststellen, ob Sie etwas davon vermeiden können.

Gibt es Muster für die Arbeit in Python? Vielleicht können Sie bereichsspezifische Hilfsfunktionen (in C geschrieben) bereitstellen, die vom Python-Code aus aufgerufen werden können.

0voto

John Montgomery Punkte 8418

Wahrscheinlich sollten Sie prüfen, ob Sie mehrere Werte im Array in einem Schritt statt in vier (oder mehr) Schritten setzen können.

Ich glaube, dass die Ellipsen-Syntax hier nützlich sein kann:

Wie verwendet man die Ellipsis-Slicing-Syntax in Python?

Oder etwas anderes wie:

Array[x,y,:]=blah

oder

Array[x,y,:]=blah1,blah2,blah3,blah4

wenn Sie für jedes Element unterschiedliche Werte haben.

Dabei wird davon ausgegangen, dass der Engpass in Ihrem Code auf die Anzahl der Zuweisungen zurückzuführen ist, die Sie durchführen. Es lohnt sich wahrscheinlich, ein Profiling durchzuführen, um genau zu sehen, was langsam ist. Versuchen Sie denselben Code, aber ohne die Ergebnisse zu speichern, um zu sehen, ob er viel schneller ist. Wenn nicht, dann liegt es wahrscheinlich nicht an der Zuweisung, die langsam ist...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X