サイズがnの2つのリストを出力する私のCプログラムからデータを読み込むためのより良い/より速いアプローチがあるかどうか、誰かが私に助言できるかどうか疑問に思っていました。私はを使ってCプログラムを呼び出しています。ctypes配列をPythonリストに変換するための高速な方法は?
以下に示すループは、いくつかのスキャンを繰り返すことで動作します。各スキャンについて、2つのリストが生成される(msX, msY
)。 c_float
のデータは、list comprehension loopを使用して抽出されます。 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
私の質問が明確でない場合は教えてください。 事前にお手数をおかけしていただきありがとうございます。
速くそのリストの内包は何もないはCPythonとPyPy https://www.pypy.orgで試してみてください。 –
'msX = mzP [:]'はリスト内包よりも速いですが、ctypes配列を直接使用するのではなく、なぜリストが必要ですか? ctypes配列に必要なメソッドがない場合は、おそらく 'array.array'で十分でしょうか? 'msX = array.array( 'f'、[0])* nPoints'から、mzP =(c_float * nPoints).from_buffer(msX)で共有するctypes配列を得ることができます。 – eryksun
コメントありがとうございます。私はあなたの最初の提案を試み、これは約ランタイムを減らします。 45%は素晴らしいです。私はそれが適切かどうかを確認するためにあなたの他の提案を見ていきます。ありがとう! – munieq11