0

私が与えられた大きなcsvには、フライトデータの大きなテーブルがあります。解析を支援するために作成した関数は、フライトIDの列を反復処理し、すべての一意のフライトIDのインデックスと値を最初に出現した順に含む辞書を返します。

辞書={インデックス:FID、...}

これは、列内のFIDの繰り返し(数十万行後...)について心配する必要がなかった古い関数への迅速な調整として提供されます。

現在、各値を順番に繰り返し比較しています。値がその後の値と等しい場合、それはスキップされます。次の値が異なる場合は、その値がディクショナリに格納されます。私はそれを今までに変更し、その値が以前にすでに発生しているかどうかを確認し、発生している場合はスキップします。
これが私のコードです:

def DiscoverEarliestIndex(self, number):                                             
        finaldata = {}                                                        
        columnvalues = self.column(number)                                             
        columnenum = {}                                                         
        for a, b in enumerate(columnvalues):                                           
            columnenum[a] = b                                                   
        i = 0                                                                                                                    
        while i < (len(columnvalues) - 1):                                             
            next = columnenum[i+1]                                              
            if columnvalues[i] == next:                                                
                i += 1                                                          
            else:                                                               
                if next in finaldata.values():                                
                    i += 1                                                      
                    continue                                                    
                else:                                                           
                    finaldata[i+1]= next                                      
                    i += 1                                                      
        else:                                                                   
            return finaldata 

これは非常に非効率的で、辞書が大きくなるにつれて遅くなります。この列には520万行あるので、Pythonでこれだけ処理するのは明らかに良い考えではありませんが、今のところはこれに固執しています。

この関数を書くためのより効率的な方法はありますか?

4

3 に答える 3

1

あなたは本質的にデータベースを探しています。データベースは、大規模なデータセットに対するそのような操作のために正確に作成されます。CSVモジュールを使用してCSV全体を一度に解析し、データベースに送信する方が、dictに保存してdict全体に対してチェックを実行するよりもはるかに高速です。

迅速な検索のための永続ストレージを備えた*大規模な*Python辞書

于 2013-03-19T20:43:26.697 に答える
1

質問に直接答えるには、dict内包表記とitertoolsモジュールを使用してこれを行うことができるはずです。

>>> import itertools as it
>>> data = {1: 'a', 2: 'a', 3: 'c', 4: 'c', 5:'d' }
>>> grouped_shit = {k: list(v) for (k,v) in it.groupby(data.iteritems(), lambda (_,v): v)}
>>> good_shit = {v[0][0]: k for (k, v) in grouped_shit.iteritems()}
>>> good_shit
{1: 'a', 3: 'c', 5: 'd'}

私はこれを少し調整できると思います-私は口述を2回調べることにあまり満足していません。しかしとにかく、私はdictの理解はかなり効率的だと思います。また、groupbyキーが正常であると想定します---つまり、すべての'a'インデックスがグループ化されていると想定します。これは、あなたの場合に当てはまるようです。

于 2013-03-19T20:47:18.813 に答える
1
if next in thegoodshit.values():   

おそらくあなたがここでしていることはあなたの問題です

  1. リストの作成
  2. リストを検索する

多分あなたはset値を保持してそれを検索するためにaを使うことができます-このようなもの:

    while i < (len(columnvalues) - 1):                                             
        next = columnenum[i+1]                                              
        if columnvalues[i] == next:                                                
            i += 1                                                          
        else:                                                               
            if next in searchable_data:                                
                i += 1                                                      
                continue                                                    
            else:                                                           
                finaldata[i+1]= next
                searchable_data.add(next)                 
                i += 1                                                      
    else:                                                                   
        return finaldata 
于 2013-03-19T21:12:58.633 に答える