2017-05-25 537 views
1

我想知道如果有人能告訴我是否有更好/更快的方法從我的C程序中讀取數據,輸出兩個大小爲的文件列表。我正在使用​​來調用C程序。將ctypes數組轉換爲python列表的更快方法?

我在下面展示的循環通過迭代多次掃描來工作。對於每次掃描,生成兩個列表(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 

讓我知道如果我的問題不清楚。 感謝您的幫助提前。

+0

嘗試使用PyPy https://www.pypy.org與CPython的沒有什麼更快該列表理解。 –

+1

'msX = mzP [:]'會比列表理解更快,但爲什麼你需要一個列表而不是直接使用ctypes數組?如果一個ctypes數組缺少一些你需要的方法,那麼'array.array'就足夠了?從'msX = array.array('f',[0])* nPoints'開始,可以通過'mzP =(c_float * nPoints).from_buffer(msX)'獲得一個ctypes數組。 – eryksun

+0

感謝您的意見。我嘗試了你的第一個建議,這將運行時間減少到約。 45%,這很好。我會看看你的其他建議,看看它是否合適。謝謝! – munieq11

回答

1

如果你願意,你可以轉換成一個陣列np.ndarray

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

它在@eryksun建議的基礎上增加了約20%的速度。謝謝! – munieq11

1

答案是使用NumPy。你可以使用NumPy來分配一個數組,將一個指向它的數據的指針傳遞給你的C API來填充它,然後在最後如果你迫切需要一個list你可以在NumPy數組上調用tolist()。但是,您可能會發現將數據保存在NumPy數組而不是列表中可以加速下游處理。