将 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
转成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
如果我的问题不清楚,请告诉我。
提前感谢您的帮助。
答案是使用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]
我想知道是否有人可以告诉我是否有一种 better/faster 方法可以从我的 C 程序中读取数据,该程序输出两个大小为 n 的列表。我正在使用 ctypes
来调用 C 程序。
我在下面显示的循环通过迭代多次扫描来工作。每次扫描都会生成两个列表 (msX, msY
)。 c_float
数据是使用列表理解循环提取的。有没有better/faster的方法把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
如果我的问题不清楚,请告诉我。 提前感谢您的帮助。
答案是使用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]