【问题标题】:Python multithreaded algorithm is not working efficientlyPython多线程算法无法有效工作
【发布时间】: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


【解决方案1】:

我不能说在这种情况下多线程有多有效,但是你做错了一件事。

在您的 sn-p 中,您正在启动一个线程,等待它完成然后再启动另一个:

for th in threadpool:
   th.start()
   th.join()

同时启动它们并等待它们的正确方法是这样的:

for th in threadpool:
   th.start()

for th in threadpool:
   th.join()

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 2013-01-06
    • 1970-01-01
    • 2020-04-27
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多