Aenaon:
私は、私は、Pythonで読む必要があるいくつかのテキストファイルを持っています。テキストファイルのみ(文字列すなわち)floatの配列を維持し、配列のサイズは2000で-2000です。私が使用しようとしたmultiprocessing
パッケージをいくつかの理由で、それは今の実行速度は低下します。以下に添付のコードのために私のPC上で私が持っている時間があります
- マルチスレッド:73.89秒
- シングルスレッド:60.47秒
私はここで間違ってやっている何を、この作業をスピードアップする方法はありますか?私のPCは、インテルCore i7プロセッサーを搭載しているし、実際の生活の中で私は、これらのテキストファイル、600またはそれ以上の数百を持っています。
import numpy as np
from multiprocessing.dummy import Pool as ThreadPool
import os
import time
from datetime import datetime
def read_from_disk(full_path):
print('%s reading %s' % (datetime.now().strftime('%H:%M:%S'), full_path))
out = np.genfromtxt(full_path, delimiter=',')
return out
def make_single_path(n):
return r"./dump/%d.csv" % n
def save_flatfiles(n):
for i in range(n):
temp = np.random.random((2000, 2000))
_path = os.path.join('.', 'dump', str(i)+'.csv')
np.savetxt(_path, temp, delimiter=',')
if __name__ == "__main__":
# make some text files
n = 10
save_flatfiles(n)
# list with the paths to the text files
file_list = [make_single_path(d) for d in range(n)]
pool = ThreadPool(8)
start = time.time()
results = pool.map(read_from_disk, file_list)
pool.close()
pool.join()
print('finished multi thread in %s' % (time.time()-start))
start = time.time()
for d in file_list:
out = read_from_disk(d)
print('finished single thread in %s' % (time.time() - start))
print('Done')
Shubhamシャルマ:
あなたは、使用しているmultiprocessing.dummy
マルチプロセッシングのAPIを複製しているが、実際には、threadingモジュールのラッパーです。
基本的に使用している、だから、Threads
代わりにProcess
。そして、threads
あなたは計算タスクを実行するときにpythonで(GILのために)有用ではありません。
だから、交換してください:
from multiprocessing.dummy import Pool as ThreadPool
と:
from multiprocessing import Pool
私は持っ自分のマシン上でコードを実行してみたi5 processor
45秒で、その完成実行を。ので、私はそれは大きな改善だと言うでしょう。
これはあなたの理解をクリア願っています。