0

私は非常に単純なプログラムに取り組んでおり、その要点を以下に示します。

    post = open(INPUTFILE1, "rb")
    for line in post:
        cut = line.split(',')
        pre = open(INPUTFILE2, "rb")
        for otherline in pre:
            cuttwo = otherline.split(',')
            if cut[1] == cuttwo[1] and cut[3] == cuttwo[3] and cut[9] == cuttwo[9]:
                OUTPUTFILE.write(otherline)
                break
    post.close()
    pre.close()
    OUTPUTFILE.close()

事実上、これは2つのcsvファイルを入力として受け取ります(「pre」と「post」)。「post」データの最初の行を調べ、列2、4、および10で一致する「pre」データの行を見つけようとします。一致する場合は、「pre」データをに書き込みます。新しいファイル。

それはうまく機能しますが、それは永遠にかかります。私の「投稿」データには数百(最大で1000)行しかないかもしれませんが、私の「前」データには1,500万行もあるかもしれません。その結果、終了までに10時間程度かかる場合があります。

私はPythonにかなり慣れていないので、最適化手法についてはまだ多くを学んでいません。誰かが私が何を試すことができるかについて何か指針を持っていますか?明らかに、「事前」データ全体で一致するものを検索すると、ログジャムが発生していることを理解しています。これをスピードアップする方法はありますか?

4

1 に答える 1

4

可能性のある行が数百行しかない場合は、次のようなものを使用します。

from operator import itemgetter
key = itemgetter(1, 3, 9)
with open('smallfile') as fin:
    valid = set(key(line.split(',')) for line in fin)

with open('largerfile') as fin:
    lines = (line.split(',') for line in fin)
    for line in lines:
        if key(line) in valid:
            # do something....

これにより、不必要な反復が省略され、効率的なルックアップのために Python ビルトインが最大限に活用されます。

一致する場合に出力で小さなファイルの行全体を使用する場合は、セットではなく辞書を使用します。

from operator import itemgetter
key = itemgetter(1, 3, 9)
with open('smallfile') as fin:
    valid = dict((key(line.split(',')), line) for line in fin)

そして、処理ループは次のようになります。

with open('largerfile') as fin:
    lines = (line.split(',') for line in fin)
    for line in lines:
        otherline = valid.get(key(line), None)
        if otherline is not None:
            # do something....
于 2012-12-09T18:58:32.400 に答える