我有一个从列表中提取数据的函数,并从这个数据中生成一个矩阵。列表长度可能有很大的大小。因此,我将数据分割成块,并将其传递给在线程中运行的函数。
# "n" is number of chunks (also number of threads)
n = 10
length = len(target_data)
s1 = 0
s2 = n
ranges = []
# this loop makes the ranges.(ex [ [0:10],[10:20],[20:30] ] ...)
for i in range(0, int(length/n)):
if i == int(length/n)-1:
s2 = -1
r = [s1,s2]
s1=s2
s2=s1+n
ranges.append(r)
for k in range(0, n):
# pass main list (target_data) and target range (ranges[k]) to function in a thread
# and then function only pick piece of list in (ranges[k]) range
# result_buffer is a shared list between threads to put results in this list
t = threading.Thread(target = DataAdapter.matrix_click, args=(target_data, result_buffer, ranges[k]))
threadpool.append(t)然后使用以下代码启动线程:
for th in threadpool:
th.start()
th.join()但是当我测量运行时间时,多线程算法仅比旧的非多线程算法快0.319637秒。另外,当我增加n的值(例如,n=10 )和测量运行时间时,它仅比旧的非多线程算法快0.21393秒!
但是,我不确定以这种方式多线程这个算法可以缩短执行时间。
我的问题:
将数据分割成块并在线程中处理每个块是正确的吗?,我应该期望我的多线程方法显著减少运行时吗?有更好的方法来实现这个算法吗?
发布于 2020-07-29 08:40:07
在这种情况下,我不能说多线程有多有效,但是有一件事你做错了。
在您的片段中,您正在启动一个线程,等待它完成,然后启动另一个线程:
for th in threadpool:
th.start()
th.join()正确的方法是同时启动它们并等待它们的出现,具体如下:
for th in threadpool:
th.start()
for th in threadpool:
th.join()祝好运。
https://stackoverflow.com/questions/63148190
复制相似问题