我有一些文本文件需要用Python读取。文本文件只保留一个浮点数组(即没有字符串(,数组的大小为2000-by-2000。我尝试使用multiprocessing
软件包,但由于某些原因,它现在运行速度较慢。我在电脑上为下面的代码所用的时间是
- 多线程:73.89秒
- 单线程:60.47秒
我做错了什么,有办法加快这项任务吗?我的电脑由英特尔酷睿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')
您使用的是multiprocessing.dummy
,它复制了多处理的API,但实际上它是线程模块的包装器
所以,基本上您使用的是Threads
而不是Process
。当你想执行计算任务时,python中的threads
是没有用的(由于GIL(。
因此替换:
from multiprocessing.dummy import Pool as ThreadPool
使用:
from multiprocessing import Pool
我试着在我的i5 processor
机器上运行你的代码,它在45秒内完成了执行。所以我认为这是一个很大的进步
希望这能让你明白。