2017-05-25 77 views
1

サイズがnの2つのリストを出力する私のCプログラムからデータを読み込むためのより良い/より速いアプローチがあるかどうか、誰かが私に助言できるかどうか疑問に思っていました。私は​​を使ってCプログラムを呼び出しています。ctypes配列をPythonリストに変換するための高速な方法は?

以下に示すループは、いくつかのスキャンを繰り返すことで動作します。各スキャンについて、2つのリストが生成される(msX, msY)。 c_floatのデータは、list comprehension loopを使用して抽出されます。 mzPとmzIから得られたc_float_ArraymsXmsYに変換する方が良いか早い方法がありますか?

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

速くそのリストの内包は何もないはCPythonとPyPy https://www.pypy.orgで試してみてください。 –

+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が必要な場合は、最後にtolist()をNumPy配列に呼び出すことができます。しかし、リストの代わりにNumPy配列にデータを保存すると、下流の処理を高速化できます。

関連する問題