1

私はPythonでファイルリーダーに取り組んでおり、asciiファイルを〜100MB読み取ることを期待しています。上部に一連のヘッダー情報があり、タブ区切りの列のみがあります。一部の列には数値以外のデータが含まれています (今は気にしません)。30MB のサンプル ファイルを 1.5 秒未満で読み取る matlab 実装があります。私の python リーダーは、CPython で約 2 秒かかりますが、IronPython では約 4 秒かかります。違いは、文字列値が変換された float を取得する場所にあるようですが、IronPython で高速化することはできませんでした。

ここでの私の最新の反復には、行を読み取って解析するための次のループがあります

#-Parse the actual data lines
istep = -1
while len(line) > 0:

    istep += 1
    #-Split the line and convert pasred values to floats
    timestep = line.split();            
    for ichan in numericChannels:                    
        data[ichan].append(float(timestep[ichan]))

    line = f.readline().strip()

numericChannels読み取りたいチャネルを指定する整数のリストです。 dataはリストのリストで、サブリストはデータの列です。

パフォーマンスの違いは、float 変換によるものと思われます。これをスピードアップするために IronPython で何ができるかについてのアイデアはありますか? ファイルを事前に読み取ってから、 System.Threading.Task.Parallel.ForEach コンストラクトを使用してファイル行を解析することさえ試みました。それはまったく役に立ちませんでした。

ありがとう。

4

3 に答える 3

0

a)「違いは文字列値がfloatに変換される場所にあるようです」と言いますが、どうしてそう思いますか?コードでプロファイラーを実行しましたか?

b)あなたが記憶を持っているなら、それはただするほうが速いかもしれません

for line in f.readlines():
于 2012-07-30T18:09:02.130 に答える
0

このようなものはもう少し速いかもしれないと私には思えます。

import operator
data=[]
istep = -1
columngetter=operator.itemgetter(*numericChannels)
while len(line) > 0:
    istep += 1
    #-Split the line and convert parsed values to floats
    timestep = line.split()
    data.append(map(float,columngetter(timestep)))
    line = f.readline().strip()

data=zip(*data)
于 2012-07-30T18:18:06.480 に答える
0

IronPython は、テキスト ファイルの読み取りが CPython よりも遅いようです。このスニペットをいくつかのバージョンの Python で実行しました (partest2.txt ファイルには、1 行に 200,000 個の数字が含まれています)。

import sys
import timeit

tmr = timeit.Timer("with open(r'partest2.txt','r') as fid:fid.readlines()")
res = tmr.timeit(number=20)
print(res)

結果:

  • CPython 2.7: 1.282
  • CPython 3.3: 1.562
  • IronPython 2.6 [.NET 2]: 2.196
  • IronPython 2.7 [.NET 4]: 2.880

IronPython を実行すると、次の警告が吐き出されます (何かに影響するかどうかはわかりません)。

< string>:1: RuntimeWarning: IronPython は GC の無効化をサポートしていません

読み込まれているファイル (partest2.txt) が変更されて、それぞれの行に同じ 200,000 の数値が指定されるようになったときのタイミングは次のとおりです (かなり異なります)。

  • CPython 2.7: 4.04
  • CPython 3.3: 7.61
  • IronPython 2.7 [.NET 4]: 20.22
  • IronPython 2.6 [.NET 2]: 21.46

うわぁ!

于 2013-09-25T18:59:15.723 に答える