2012-02-10 3 views
0

私は現在、大きなバイナリファイルからデータを読み込むためにC/Python APIを使用しています。 Pythonのこの結果は、純粋なC結果(時間x2)と同じくらい効率的ではないと思います。通常は、42要素のタプルをPyArrayObjectに格納します。これを行うには、私が使用します。C/Python API:Py_BuildValueの使用

PyObject *r = Py_BuildValue("(f, I, i, K, f, K, K, etc..)", a, b, c, etc...) ;

私の質問は以下の通りです:それを行うには、より効率的な方法(速く実行時間)はありますか?

たとえば:PyTuple_Pack(n、args)はそれをより迅速に行いますか?

+0

はい、Cでプログラムを書いてください。 –

答えて

0

タイムクリティカルなコードでは、目的の長さのタプルを作成し、コンポーネントを個別に作成してタプルに埋め込みます。

+0

私は最後に試しましたが、同じ時間がかかります。 – embrouille

0

struct.unpackをカスタマイズしているようです...バイナリファイルリーダーを純粋なPythonで作成してみましたか(非常に素早く)、 "ストローマン"として使用できますか?

import struct 
fmt = "f I i Q f Q Q etc.." # check endianness and alignment 
structobj = struct.Struct(fmt) 
recsz = structobj.size 
assert recsz == EXPECTED_RECSZ 
unpack = structobj.unpack 
f = open('bigfile.bin', 'rb') 
while True: 
    record = f.read(recsz) 
    if not record: break 
    a_tuple = unpack(record) 
    do_something(a_tuple) 
f.close() 

サイドリスト:(1)ファイルには32ビット浮動小数点数と64ビット整数がありますか? (2)第1引数に括弧を入れたPy_BuildValueはタプルを返します。あなたが言ったこの "PyArrayObject"は何ですか?

+0

私はstruct.unpackでPythonで試しましたが、遅すぎます。 1:ファイルにはさまざまな種類の数値型があります:uint32、uint16、int32など... 2:PyArrayは私のuplesを格納する配列です。私はPy_BuildValueソリューションを少しでも遅くしてもそれを利用すると思います。あなたの返事をありがとう。 – embrouille

+0

(1)私のコード例では 'struct.unpack'は呼び出されません。フォーマットをプリコンパイルします。あなたのファイルの量はどれくらいですか?平均的なファイルをロードするのにどれくらい時間がかかりますか? (2)データ型についてのポイントは、あるファイルが32ビット浮動小数点数と64ビット整数の両方を持つことはむしろ珍しいと思ったということでした。 –

+0

Ok。私は初めてそれを理解しませんでした。私は月曜日にあなたのアイデアを試してみる、それは本当に良いようだ。私のファイルは20Moの読み込みに20秒かかります – embrouille

関連する問題