コードを高速化する簡単な方法を探しています

学習者

コードを高速化する方法を探しています。コードのほとんどの部分を高速化し、実行時間を約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とテキストの本文とタイトルのみが含まれています。列はコンマで区切られます。

steveha

半ダースほどのダミーサンプルデータセットを投稿していただけませんか?

あなたのコードが何をしているのかよくわかりません。私はパンダの専門家ではありませんが、このコードを大幅に高速化できると思います。すべてのデータをメモリに読み込み、さまざまな場所にデータを再コピーし続けます。

「怠惰な」コードを書くことで、すべての再コピーを回避できるはずです。理想は、1行を読み取り、必要に応じて変換し、最終的な宛先に格納することです。また、このコードは、値を反復処理する必要がある場合にインデックスを使用します。そこでもスピードを上げることができます。

あなたが投稿したコードは実際のコードですか、それともここに投稿するためだけに作成したものですか?いくつかの間違いが含まれているように見えるので、実際に何をするのかわかりません。特に、trainlabelsは同一のデータを含んでいるように見えます。

サンプルデータを投稿したかどうかを確認します。もしそうなら、私はおそらくあなたのために「怠惰な」コードを書くことができます。それはデータの再コピーが少なく、より速くなります。

編集:あなたの新しい情報に基づいて、ここに私のダミーデータがあります:

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]

編集
0

コメントを追加

0

関連記事

分類Dev

簡単なPrologコードを理解する助けを探しています

分類Dev

パンダのデータフレーム検索を高速化する方法を探しています

分類Dev

Numba を使用して次のコードを高速化する

分類Dev

配列を使用してコードを高速化するExcelVBA

分類Dev

libclangを使用してC ++コードの解析を高速化する方法は?

分類Dev

kaggleのノートブックからPythonコードを抽出する簡単な方法を探していますか?

分類Dev

jsを介してフォームを検証する簡単な方法を探しています。

分類Dev

FFMPEG | ビデオをエンコードして高速化する方法

分類Dev

FFMPEG | ビデオをエンコードして高速化する方法

分類Dev

Rで単純な変異コマンドを高速化する方法

分類Dev

MySQL:別のテーブルの行と一致しない行を探す左結合を高速化する方法はありますか?

分類Dev

VBAコードを高速化する

分類Dev

VBAコードを高速化する

分類Dev

このループコードを高速化する方法は?

分類Dev

コードを最適化してセットアップを高速化する方法

分類Dev

このコードを高速化する方法はありますか?

分類Dev

このコードを高速化する方法はありますか?

分類Dev

Rcppを使用してRコードを高速化できますか?

分類Dev

numbaを使用して次のコードを高速化するにはどうすればよいですか?

分類Dev

OpenMPを使用してコードC ++を高速化するにはどうすればよいですか?

分類Dev

forループからRコードを高速化する良い方法

分類Dev

DFSを連結するように注文する簡単な方法を探しています

分類Dev

ExcelVBA-ループを単純化する方法を探しています

分類Dev

このPythonコードを高速化する方法は?

分類Dev

iOS / MacOSのメタルコードを高速化する方法

分類Dev

numpyコードを高速化する方法

分類Dev

コードを高速化する方法は?

分類Dev

Rcppを使用してforループを高速化する方法は?

分類Dev

複数の IF ステートメントを使用してコードを高速化する方法

Related 関連記事

  1. 1

    簡単なPrologコードを理解する助けを探しています

  2. 2

    パンダのデータフレーム検索を高速化する方法を探しています

  3. 3

    Numba を使用して次のコードを高速化する

  4. 4

    配列を使用してコードを高速化するExcelVBA

  5. 5

    libclangを使用してC ++コードの解析を高速化する方法は?

  6. 6

    kaggleのノートブックからPythonコードを抽出する簡単な方法を探していますか?

  7. 7

    jsを介してフォームを検証する簡単な方法を探しています。

  8. 8

    FFMPEG | ビデオをエンコードして高速化する方法

  9. 9

    FFMPEG | ビデオをエンコードして高速化する方法

  10. 10

    Rで単純な変異コマンドを高速化する方法

  11. 11

    MySQL:別のテーブルの行と一致しない行を探す左結合を高速化する方法はありますか?

  12. 12

    VBAコードを高速化する

  13. 13

    VBAコードを高速化する

  14. 14

    このループコードを高速化する方法は?

  15. 15

    コードを最適化してセットアップを高速化する方法

  16. 16

    このコードを高速化する方法はありますか?

  17. 17

    このコードを高速化する方法はありますか?

  18. 18

    Rcppを使用してRコードを高速化できますか?

  19. 19

    numbaを使用して次のコードを高速化するにはどうすればよいですか?

  20. 20

    OpenMPを使用してコードC ++を高速化するにはどうすればよいですか?

  21. 21

    forループからRコードを高速化する良い方法

  22. 22

    DFSを連結するように注文する簡単な方法を探しています

  23. 23

    ExcelVBA-ループを単純化する方法を探しています

  24. 24

    このPythonコードを高速化する方法は?

  25. 25

    iOS / MacOSのメタルコードを高速化する方法

  26. 26

    numpyコードを高速化する方法

  27. 27

    コードを高速化する方法は?

  28. 28

    Rcppを使用してforループを高速化する方法は?

  29. 29

    複数の IF ステートメントを使用してコードを高速化する方法

ホットタグ

アーカイブ