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.
Versuchen mit PyPy https://www.pypy.org mit CPython gibt es nichts schneller als Liste Verständnis. –
'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
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