コードを高速化する方法を探しています。コードのほとんどの部分を高速化し、実行時間を約10時間に短縮しましたが、それでも十分な速度ではなく、時間が不足しているため、コードを最適化するための迅速な方法を探しています。
例:
text = pd.read_csv(os.path.join(dir,"text.csv"),chunksize = 5000)
new_text = [np.array(chunk)[:,2] for chunk in text]
new_text = list(itertools.chain.from_iterable(new_text))
上記のコードでは、約600万行のテキストドキュメントをチャンクで読み取り、フラット化します。このコードの実行には約3〜4時間かかります。これが私のプログラムの主なボトルネックです。編集:私は主な問題が何であるかについてあまり明確ではないことに気づきました。平坦化は最も時間がかかる部分です。
また、私のプログラムのこの部分には長い時間がかかります。
train_dict = dict(izip(text,labels))
result = [train_dict[test[sample]] if test[sample] in train_dict else predictions[sample] for sample in xrange(len(predictions))]
上記のコードは、最初にテキストドキュメントを対応するラベルで圧縮します(これは機械学習タスクであり、train_dictがトレーニングセットです)。プログラムの早い段階で、テストセットで予測を生成しました。電車とテストセットの間に重複があるので、それらの重複を見つける必要があります。したがって、テストセットを1行ずつ(合計200万行)繰り返す必要があります。重複が見つかった場合、実際には予測されたラベルを使用したくはありませんが、train_dictの重複からのラベルを使用します。この反復の結果を上記のコードの変数resultに割り当てます。
Pythonには、コードの一部を高速化できるさまざまなライブラリがあると聞きましたが、どれがその仕事を実行できるかわかりません。これを調査する時間がないので、誰かが必要です。私を正しい方向に向けてください。上記のコードスニペットを高速化する方法はありますか?
edit2
もう一度調査しました。そして、それは間違いなくメモリの問題です。私はファイルを行ごとに読み取ろうとしましたが、しばらくすると速度が劇的に低下し、さらにRAMの使用量はほぼ100%になり、Pythonのディスクの使用量は急激に増加しました。どうすればメモリフットプリントを減らすことができますか?または、すべてをメモリに保持しないようにする方法を見つける必要がありますか?
edit3記憶が私の問題の主な問題なので、プログラムの一部の概要を説明します。とりあえず予測を落としたので、プログラムの複雑さが大幅に軽減されました。代わりに、テストセット内の重複していないものごとに標準サンプルを挿入します。
import numpy as np
import pandas as pd
import itertools
import os
train = pd.read_csv(os.path.join(dir,"Train.csv"),chunksize = 5000)
train_2 = pd.read_csv(os.path.join(dir,"Train.csv"),chunksize = 5000)
test = pd.read_csv(os.path.join(dir,"Test.csv"), chunksize = 80000)
sample = list(np.array(pd.read_csv(os.path.join(dir,"Samples.csv"))[:,2]))#this file is only 70mb
sample = sample[1]
test_set = [np.array(chunk)[:,2] for chunk in test]
test_set = list(itertools.chain.from_iterable(test_set))
train_set = [np.array(chunk)[:,2] for chunk in train]
train_set = list(itertools.chain.from_iterable(train_set))
labels = [np.array(chunk)[:,3] for chunk in train_2]
labels = list(itertools.chain.from_iterable(labels))
"""zipping train and labels"""
train_dict = dict(izip(train,labels))
"""finding duplicates"""
results = [train_dict[test[item]] if test[item] in train_dict else sample for item in xrange(len(test))]
これは私のプログラム全体ではありませんが、これは最適化が必要な私のコードの一部です。ご覧のとおり、このパートでは、パンダ、numpy、itertoolsの3つの重要なモジュールのみを使用しています。train_setとtest_setをフラット化すると、メモリの問題が発生します。私がしているのは、ファイルを読み込んで、必要な部分を取得し、辞書の対応するラベルを使用して列車のドキュメントを圧縮することだけです。そして、重複を検索します。
編集4要求に応じて、データセットの説明をします。私のTrain.csvには4つの列が含まれています。最初の列にはすべてのサンプルのIDが含まれ、2番目の列にはタイトルが含まれ、3番目の列にはテキスト本文のサンプル(100〜700語)が含まれます。4番目の列には、カテゴリラベルが含まれています。Test.csvには、IDとテキストの本文とタイトルのみが含まれています。列はコンマで区切られます。
半ダースほどのダミーサンプルデータセットを投稿していただけませんか?
あなたのコードが何をしているのかよくわかりません。私はパンダの専門家ではありませんが、このコードを大幅に高速化できると思います。すべてのデータをメモリに読み込み、さまざまな場所にデータを再コピーし続けます。
「怠惰な」コードを書くことで、すべての再コピーを回避できるはずです。理想は、1行を読み取り、必要に応じて変換し、最終的な宛先に格納することです。また、このコードは、値を反復処理する必要がある場合にインデックスを使用します。そこでもスピードを上げることができます。
あなたが投稿したコードは実際のコードですか、それともここに投稿するためだけに作成したものですか?いくつかの間違いが含まれているように見えるので、実際に何をするのかわかりません。特に、train
とlabels
は同一のデータを含んでいるように見えます。
サンプルデータを投稿したかどうかを確認します。もしそうなら、私はおそらくあなたのために「怠惰な」コードを書くことができます。それはデータの再コピーが少なく、より速くなります。
編集:あなたの新しい情報に基づいて、ここに私のダミーデータがあります:
id,title,body,category_labels
0,greeting,hello,noun
1,affirm,yes,verb
2,deny,no,verb
上記を読み取るコードは次のとおりです。
def get_train_data(training_file):
with open(training_file, "rt") as f:
next(f) # throw away "headers" in first line
for line in f:
lst = line.rstrip('\n').split(',')
# lst contains: id,title,body,category_labels
yield (lst[1],lst[2])
train_dict = dict(get_train_data("data.csv"))
そして、これがより速いビルド方法results
です:
results = [train_dict.get(x, sample) for x in test]
test
次の項目を見つけるために繰り返しインデックスを作成する代わりに、テストの値を繰り返し処理します。このdict.get()
メソッドは、if x in train_dict
必要なテストを処理します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加