2017-05-25 3 views
1

Ich fragte mich, ob mir jemand sagen könnte, ob es einen besseren/schnelleren Ansatz zum Lesen von Daten aus meinem C-Programm gibt, der zwei Listen der Größe n ausgibt. Ich verwende ctypes, um das C-Programm aufzurufen.Schneller Weg, um Ctypes-Array in Python-Liste zu konvertieren?

Die Schleife, die ich unten zeige, funktioniert durch Iterieren über eine Anzahl von Scans. Für jeden Scan werden zwei Listen erstellt (msX, msY). Die Daten werden extrahiert, indem Listenverstehensschleife verwendet. Gibt es einen besseren/schnelleren Weg, die von mzP und mzI erhaltene c_float_Array in msX und msY umzuwandeln?

for scan in xrange(nScans): 
    mzP = (c_float * nPoints)() # pointer to list 1, c_float_Array 
    mzI = (c_float * nPoints)() # pointer to list 2, c_float_Array 
    mlLib.readData(filePointer, 1, scan, byref(mzP), byref(mzI)) 
    # The slow part... 
    msX = [mzP[i] for i in xrange(nPoints)] # list with mzP data 
    msY = [mzI[i] for i in xrange(nPoints)] # list with mzI data 

Lassen Sie mich wissen, wenn meine Frage nicht klar ist. Vielen Dank für Ihre Hilfe im Voraus.

+0

Versuchen mit PyPy https://www.pypy.org mit CPython gibt es nichts schneller als Liste Verständnis. –

+1

'msX = mzP [:]' wäre schneller als ein Listenverständnis, aber warum brauchen Sie eine Liste, anstatt direkt das ctypes-Array zu verwenden? Wenn einem Ctypes-Array eine Methode fehlt, die Sie brauchen, reicht vielleicht ein 'array.array'? Beginnend mit 'msX = array.array ('f', [0]) * nPoints', können Sie ein ctypes-Array erhalten, das es über' mzP = (c_float * nPoints) .from_buffer (msX) 'teilt. – eryksun

+0

Danke für die Kommentare. Ich habe deinen ersten Vorschlag ausprobiert und dies reduziert die Laufzeit auf ca. 45%, das ist großartig. Ich werde mir Ihren anderen Vorschlag ansehen, um zu sehen, ob er geeignet ist. Vielen Dank! – munieq11

Antwort

1

Wenn Sie möchten, können Sie mit np.ndarray in ein Array umwandeln:

msX = np.ndarray((nPoints,), 'f', mzP, order='C')  
msY = np.ndarray((nPoints,), 'f', mzI, order='C') 
+0

Es erhöht die Geschwindigkeit um ca. 20% zusätzlich zu dem, was @eryksun vorgeschlagen hat. Vielen Dank! – munieq11

1

Die Antwort ist, NumPy zu verwenden. Sie können NumPy verwenden, um ein Array zuzuweisen, einen Zeiger auf seine Daten an Ihre C-API zu übergeben, die es auffüllt, und am Ende, wenn Sie verzweifelt nach einem list suchen, können Sie tolist() auf dem NumPy-Array aufrufen. Sie werden jedoch wahrscheinlich feststellen, dass Sie die Downstream-Verarbeitung beschleunigen können, wenn Sie die Daten in einem NumPy-Array anstelle einer Liste speichern.

Verwandte Themen