更快速地将ctypes数组转换为python列表?

时间:2017-05-25 11:55:06

标签: python ctypes

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

我在下面显示的循环通过迭代多次扫描来工作。对于每次扫描,生成两个列表(msX, msY)。使用列表推导循环提取c_float数据。是否有更好/更快的方式将从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

如果我的问题不明确,请告诉我。 感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

如果您愿意,可以转换为np.ndarray的数组:

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

答案 2 :(得分:0)

我可能缺少一些东西,但这对我有用:

from ctypes import c_float

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