python - Python多线程算法无法有效工作
问题描述
我有一个从列表中提取数据并从该数据生成矩阵的函数。列表长度可能很大。因此,我将数据拆分为块,然后将其传递给函数以在线程中运行。
# "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秒!
我如何不确定以这种方式多线程这个算法会减少执行时间。
我的问题:
我将数据分成块并在线程中处理每个块是否正确?
我应该期望我的多线程方法显着减少运行时间吗?
有没有更好的方法来实现这个算法?
解决方案
我不能说在这种情况下多线程有多有效,但是你做错了一件事。
在您的代码段中,您正在启动一个线程,等待它完成,然后再启动另一个:
for th in threadpool:
th.start()
th.join()
同时启动它们并等待它们的正确方法是这样的:
for th in threadpool:
th.start()
for th in threadpool:
th.join()
祝你好运。
推荐阅读
- r - 在 API GET 请求中,我应该在哪里插入我的 API 密钥?
- github - 我不小心删除了 github 存储库中的文件,但我仍然在本地保存它们
- emacs - 尽管“加载路径”列表正确,但 Flycheck 报告“无法打开加载文件”
- sql - 如何在单个查询中加入 3 个表
- jquery - jquery切换搜索栏在点击时没有关闭,它会是什么?
- php - 如何更改现有的永久链接(PHP、HTML、CSS)
- python - 张量流重塑使用
- java - 处理 TreeSet 中的重复项
- google-chrome - 谷歌浏览器网络::ERR_TOO_MANY_RETRIES
- javascript - 使用 JQuery 修改元素