【发布时间】:2020-11-18 17:22:57
【问题描述】:
我有一个从列表中提取数据的功能,并从这些数据中生成一个矩阵。 列表长度可能很大。因此,我将数据拆分为块,然后将其传递给函数以在线程中运行。
# "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 秒!
我不确定以这种方式多线程处理该算法是否会减少执行时间。
我的问题:
我将数据分成块并在一个线程中处理每个块是否正确?
我应该期望我的多线程方法显着减少运行时间吗?
有没有更好的方法来实现这个算法?
【问题讨论】:
-
给定的信息不完整。无法判断性能改进。如果以前的时间是 0.39 秒,现在快了 0.31 秒,那不是很好吗?你有单核机器吗?你在VM中运行它吗?你知道 Python 的 GIL 吗?您是否尝试过多处理?你期待什么表现?你有几个核心?它使用多少内存?是否涉及磁盘交换?
target_data是什么?
标签: python multithreading algorithm