我想知道是否有人可以告诉我是否有更好/更快的方法从我的C程序读取数据,输出两个大小 n 的列表。我正在使用ctypes
来调用C程序。
我在下面显示的循环通过迭代多次扫描来工作。对于每次扫描,生成两个列表(msX, msY
)。使用列表推导循环提取c_float
数据。是否有更好/更快的方式将从mzP和mzI获得的c_float_Array
转换为msX
和msY
?
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
如果我的问题不明确,请告诉我。 感谢您的帮助。
答案 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]