2017-01-23 3 views
1

私は、宿題が割り当てられているので、Pythonに戻ってきて、コードの高速化に関する支援を探しています。私の最後の投稿は私のアイデアを提供しなかったために落ちたので、今度はもっとうまくやっていきます。Python - トランザクション・データをリストのリストにロードし、各文字列の数をカウントします。

各文字は、特定の製品の購入に対応し、各行は最初の行のトランザクション(ある
A B C D E F 
A E F G H I J K 
A B D E F G H 
B C D F G H 
G H I K J 
G H I J 
B C D H J K 
B C D H K 
A C E G I K 
A B D F G H I 
A B C D E F G H I J K 
A B C D E 
C D F G 
C E F G H I 
C D E J K 
J K 
G H I J K 
A B D 
A C D K 
A B D I J K 
A B C E F G 
F G I J K 
A F G K 
B C E F G H 
A D E 
A B 
C D E F 
C E F G H I J 
I J K 
E F H I J K 

、誰かが買っ:

私はこのようになります取引を購入するテキストファイルを持っています製品ABCDEおよびF)。私は各製品が何回購入されたかについての予備的なカウントを行い、少なくともS回購入したアイテムのリストを作成する必要があります。これは私のコードは次のようになります。私は提供フルtxtファイルに私のプログラムを実行すると

import itertools 
import operator 

item_data_lol = [] 
with open("test_file.txt") as inputfile: 
    for line in inputfile: 
     item_data_lol.append(line.strip().split(',')) 

# this is what item_data_lol loads in as 
# [['A B C D E F'], ['A E F G H I J K'], ['A B D E F G H'], ['B C D F G H'], ['G H I K J'], ['G H I J'], ['B C D H J K'], ['B C D H K'], ['A C E G I K'], ['A B D F G H I'], ['A B C D E F G H I J K'], ['A B C D E'], ['C D F G'], ['C E F G H I'], ['C D E J K'], ['J K'], ['G H I J K'], ['A B D'], ['A C D K'], ['A B D I J K'], ['A B C E F G'], ['F G I J K'], ['A F G K'], ['B C E F G H'], ['A D E'], ['A B'], ['C D E F'], ['C E F G H I J'], ['I J K'], ['E F H I J K']] 

S = 14 

# initialize dictionary to count frequency of individual items 
first_lookup = {} 

# loop over each row, then each element, obtaining a total element count for each element 
for line in item_data_lol: 
    line = line[0] 
    for item in line.split(): 
     if item in first_lookup.keys(): 
      first_lookup[item] += 1 
     else: 
      first_lookup[item] = 1 


# Get list of frequent items 
frequent_items = [] 
for this_key, this_value in first_lookup.iteritems(): 
    if this_value > support_threshold: 
     frequent_items.append(this_key) 

print(first_lookup) 
print(frequent_items) 

コードのこの構造は、私の小さなデータセットのために正常に動作しますが、これは驚くほど長い時間がかかります。このコードは、私が書かなければならないより大きいアルゴリズムのほんの一部です(頻出アイテムセットを見つけるための先験的なアルゴリズム)。したがって、この最初の部分は長い間かかるようになっています。もし私が別のpython関数を使ってコードのこの部分をスピードアップできれば(私は主にループのために使います。そして、私がPythonで錆びていて、多くの関数を覚えていないので)、私のプログラムの後半部分同じように。

はあなたが辞書のキーの代わりに、辞書自体での悲しげに、古典的なテストに直面し

+2

:この(ジェネレータの理解によって初期化collections.Counterを使用して)、さらにそれをスピードアップするでしょうによって

for line in item_data_lol: line = line[0] for item in line.split(): if item in first_lookup.keys(): first_lookup[item] += 1 else: first_lookup[item] = 1 

'collections'から' defaultdict'を使うと、あなたのフックを使うのではなく、物事をスピードアップさせるかもしれません。 –

+1

@ juanpa.arrivillaga:はい、自然に行く方法。しかし、その問題はそれ以上に悪かった。 –

答えて

4

これをスピードアップする方法上の任意の考えを感謝しています。

if item in first_lookup.keys(): 

は、辞書検索から利益を得る

if item in first_lookup: 

でなければなりません。 first_lookup.keys()への明示的な呼び出しは、Python 2でlistを生成するので、inは辞書ではないリストに適用されます。そのループを交換し、あなたの場合は

、: `Counter`かを`使用して

import collections 
first_lookup = collections.Counter(item for line in item_data_lol for item in line[0].split()) 
+1

Oof。いいキャッチ! –

+0

あなたのcollections.Counter()関数を実行しようとするとエラーが発生しましたが、洞察力ありがとうございました - 'builtin_function_or_method'オブジェクトは反復不可能です – Canovice

+1

分割後に申し訳ありません。 –

関連する問題