0

かなり大きなtxtファイルから派生したオブジェクトを作成しています。コードは正常に動作していますが、実行に時間がかかります。これは、最初に探している要素が順序付けられておらず、(必然的に) 一意ではないためです。たとえば、ファイルで 2 回使用される可能性があるが、最初と最後の行にある可能性がある数字コードを探しています。私の考えは、特定のコードがどのくらいの頻度で使用されているかを確認することでした...

counter=collections.Counter([l[3] for l in self.body])

...そして、カウンターをループします。アドバンス: コードが 1 回だけ使用される場合は、ファイル全体を反復処理する必要はありません。ただし、プロセスが非常に遅くなる多くの反復で立ち往生しています。

だから私の質問は本当に:どうすれば私のコードを改善できますか? もちろん、別のアイデアは、最初にデータを注文することです。しかし、それにもかなりの時間がかかる可能性があります。

重要な部分は次の方法です。

def get_pc(self):
    counter=collections.Counter([l[3] for l in self.body])
    # This returns something like this {'187':'2', '199':'1',...}

    pcode = []

    #loop through entries of counter
    for k,v in counter.iteritems():
        i = 0
        #find post code in body
        for l in self.body:
            if i == v:
                break
            # find fist appearence of key 
            if l[3] == k:
                #first encounter...
                if i == 0:
                    #...so create object
                    self.pc = CodeCana(k,l[2])
                    pcode.append(self.pc)
                i += 1
                # make attributes
                self.pc.attr((l[0],l[1]),l[4])
            if v <= 1:
                break
    return pcode

コードで問題が十分に説明されていることを願っています。そうでない場合はお知らせください。提供された情報を拡大します。

4

1 に答える 1

2

あなたは何度もループしてbodyいます。これを1 つのループにまとめCodeCana、代わりに辞書でアイテムを追跡します。

def get_pc(self):
    pcs = dict()    
    pcode = []

    for l in self.body:
        pc = pcs.get(l[3])
        if pc is None:
            pc = pcs[l[3]] = CodeCana(l[3], l[2])
            pcode.append(pc)
         pc.attr((l[0],l[1]),l[4])

    return pcode

最初にすべてのアイテムを数えてから、さまざまなbody種類のアイテムすべてをループしながら、その回数だけループオーバーを制限しようとすると、目的が多少損なわれます...

名前にさまざまなインデックスを付けることを検討することをお勧めしlます。タプルアンパッキングを使用できます:

for foo, bar, baz, egg, ham in self.body:
    pc = pcs.get(egg)
    if pc is None:
        pc = pcs[egg] = CodeCana(egg, baz)
        pcode.append(pc)
     pc.attr((foo, bar), ham)

しかし、ベースのクラスから構築bodyすると、コードのドキュメント化とデバッグにさらに役立ちます。namedtuple

于 2013-07-12T12:31:41.267 に答える