私は、宿題が割り当てられているので、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で錆びていて、多くの関数を覚えていないので)、私のプログラムの後半部分同じように。
はあなたが辞書のキーの代わりに、辞書自体での悲しげに、古典的なテストに直面し
:この(ジェネレータの理解によって初期化
collections.Counter
を使用して)、さらにそれをスピードアップするでしょうによって'collections'から' defaultdict'を使うと、あなたのフックを使うのではなく、物事をスピードアップさせるかもしれません。 –
@ juanpa.arrivillaga:はい、自然に行く方法。しかし、その問題はそれ以上に悪かった。 –