使用多处理读取文本文件的速度比不使用多处理慢



我有一些文本文件需要用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秒内完成了执行。所以我认为这是一个很大的进步

希望这能让你明白。

最新更新