以下是我在python 3.x中实现的线程池执行程序
with ThreadPoolExecutor(max_workers=15) as ex:
f = open(filename, 'r', encoding='UTF-8')
results = {ex.submit(callreadline, files ): files for files in f.readlines() }
结果变量包含以下格式的值:
words and their corresponding 200 dimensional embedding
您可以看到这些值是元组。第一个值是一个单词,第二个值是200维数组。值的总数为400000。所以有40万个元组。
现在我要做的是创建另一个执行以下任务的线程池执行程序
{the:0,is:1,are:2,said:3,...…………….hello:399999}
我正在使用以下代码进行循环
count = 0
word_to_idx = OrderedDict()
vectors = []
for future in results.result:
b = future.result()
word_to_idx[count] = b[0]
if(count == 0):
vectors = np.array([b[1]])
else:
vectors = np.append(vectors,np.array([b[1]]),axis=0)
count = count +1
在上述函数的结尾,我返回了完成此工作的word_to_idx和向量。但是,循环400000个元组并将变量一一分配需要花费很长时间(大约10个小时)。
所以我在考虑是否有一种使用线程池执行程序并行化此功能的方法。
我当时正在考虑创建线程,然后与每个线程共享一个计数器变量,以便一次访问一个共享变量。然后,该线程将递增该变量,然后另一个线程将访问递增的计数器。有人可以指出我正确的方向吗?
编辑:
这是调用readline函数,它在15个工作人员被调用时运行得非常快:
def callreadline(line):
# word_to_idx = OrderedDict()
word_to_idx = OrderedDict()
vectors = []
vocabulary = None
word_to_idx = read_w2v_word(line.split(' ')[0])
try:
vectors = np.append(vectors, [np.array(line.split(' ')[1:])], axis=0)
except:
vectors = np.array(line.split(' ')[1:],dtype=float)
if vocabulary is not None:
word_to_idx, vectors = filter_words(word_to_idx, vectors, vocabulary)
return word_to_idx,vectors
答案 0 :(得分:0)
我觉得callreadline函数还没有达到尽可能快的速度,但这不是问题的一部分,所以让我尝试为您解决其余问题:
with ThreadPoolExecutor(max_workers=15) as ex:
f = open(filename, 'r', encoding='UTF-8')
results = [ex.submit(callreadline, files) for files in f.readlines()]
word_to_idx = dict()
vectors = []
for count, future in enumerate(results):
b = future.result()
word_to_idx[b[0]] = count
vectors.append(b[1])
vectors = np.array(vectors)