将 ctypes 数组转换为 python 列表的更快方法?

Faster way to convert ctypes array to python list?

我想知道是否有人可以告诉我是否有一种 better/faster 方法可以从我的 C 程序中读取数据,该程序输出两个大小为 n 的列表。我正在使用 ctypes 来调用 C 程序。

我在下面显示的循环通过迭代多次扫描来工作。每次扫描都会生成两个列表 (msX, msY)。 c_float 数据是使用列表理解循环提取的。有没有better/faster的方法把mzP和mzI得到的c_float_Array转成msXmsY

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

如果我的问题不清楚,请告诉我。 提前感谢您的帮助。

答案是使用NumPy。您可以使用 NumPy 分配一个数组,将指向其数据的指针传递给您的 C API ,这将填充它,然后在最后如果您迫切需要 list 您可以调用 tolist() 在 NumPy 数组上。但是,您可能会发现将数据存储在 NumPy 数组而不是列表中可以加速下游处理。

如果愿意,可以使用 np.ndarray:

转换为数组
msX = np.ndarray((nPoints, ), 'f', mzP, order='C')    
msY = np.ndarray((nPoints, ), 'f', mzI, order='C') 

我可能遗漏了一些东西,但这对我有用:

from ctypes import c_float

arr = (c_float * 3)(1,2,3)
arr[:]
#Result: [1.0, 2.0, 3.0]