1

私は初心者です。私はマルチスレッドを使用してcountvectorizer()のコードを再現しようとしています。 LogisticRegressionを使用して感情分析を行うには、私はyelpデータセットを使用しています。これは私がこれまでに書かれたものです:Pythonでのスレッドプールは、期待通りの速さではありません。

コードスニペット:ここ

from multiprocessing.dummy import Pool as ThreadPool 
from threading import Thread, current_thread 
from functools import partial 
data = df['text'] 
rev = df['stars'] 


y = [] 
def product_helper(args): 
    return featureExtraction(*args) 


def featureExtraction(p,t):  
    temp = [0] * len(bag_of_words) 
    for word in p.split(): 
     if word in bag_of_words: 
      temp[bag_of_words.index(word)] += 1 

    return temp 


# function to be mapped over 
def calculateParallel(threads): 
    pool = ThreadPool(threads) 
    job_args = [(item_a, rev[i]) for i, item_a in enumerate(data)] 
    l = pool.map(product_helper,job_args) 
    pool.close() 
    pool.join() 
    return l 

temp_X = calculateParallel(12) 

これはコードのほんの一部です。

説明:

df['text']レビューをすべて持っているとdf['stars']を評価(1〜5)を持っています。私はマルチスレッドを使用して単語数ベクトルtemp_Xを見つけようとしています。 bag_of_wordsは頻繁に選ぶ単語のリストです。

質問:マルチスレッドなし

、私は約24分でtemp_Xを計算することができましたし、上記のコードは、サイズ100Kレビューのデータセットのために33分を要しました。私のマシンは128GBのDRAMと12個のコアを持っています(6個の物理コアとハイパースレッディング、つまり1コアあたりのスレッド= 2)。

私はここで間違っていますか?

答えて

1

あなたの全体のコードが使用

を使用CPU BoundではなくIO Bound。あなたは、ちょうどそう効果的にただ一つのスレッドを実行しているGIL下にあるthreadsを使用しているプラ​​スoverheads.Itは、複数のコア上で1つのcore.Toの実行時にのみ実行さそうですThreadPoolのようmultiprocessing.dummyインポートプールから

import multiprocessing 
pool = multiprocessing.Pool() 
l = pool.map_async(product_helper,job_args) 

はmodule.Itがそれよりもちょうどone coreはなく、よりを利用thread上単なるラッパーです。

+0

ありがとうございました。私はここでより多くの質問があります。使用するコアの数はどこで指定しますか? –

+0

@bhaskarjupudiそれは、利用可能なコアの数を選択します..... multiprocessing.cpu_count()から自動的に – vks

+0

投稿したコードスニペットでは、lはオブジェクトです。どのようにそのオブジェクトから実際のリストを取得するには? –

0

Pythonとスレッドは実際にはうまく連携しません。 GIL(global interperter lock)と呼ばれる既知の問題があります。基本的には、たとえ複数のCPUコアを持っていても、すべてのスレッドがparrallelで実行されないようにするインターペアのロックがあります。 Pythonは単に各スレッドに数ミリ秒のCPU時間を与えるだけです(そして遅くなったのは、スレッド間のコンテキスト切り替えによるオーバーヘッドです)。 https://pymotw.com/2/multiprocessing/basics.html

注:マルチプロセッシングは、マルチスレッドに100%のequivilentではありませんhttp://www.dabeaz.com/python/UnderstandingGIL.pdf

は、私はあなたが複数の処理をしようと提案し、あなたの問題を解決するには、次の

はここにそれがどのように機能するかを説明し、本当に良いドキュメントです。マルチプロセスは並行して実行されますが、異なるプロセスはメモリを共有しません。したがって、それらの変数の1つを変更すると、他のプロセスでは変更されません。

関連する問題