如何在 python 中最大化多线程的性能



我想使用多线程来获取一组字符串中最长的子字符串。以下代码有效。但是,当我打开任务管理器时,只使用了大约 40% 的 CPU。为什么?如何最大化 CPU 功率?

def longest_substring(s, t, score, j):
match = difflib.SequenceMatcher(None, s, t).get_matching_blocks()
char_num = []
for i in match:
char_num.append(i.size)
score[j] = max(char_num)
for i in range(m):
score = [None]*n
s = df.loc[i, 'ocr']
threads = [threading.Thread(target=longest_substring, args=(s, db.loc[j, 'ocr'], score, j)) for j in range(n)]
for t in threads:
t.start()
for t in threads:
t.join()

并行处理可能有点棘手,我在下面给你一些解决方案:

首先:Python的GIL(全局解释锁( 您看到的使用情况可能是正在使用的内核数量有限。这是因为默认情况下多线程不会同时工作,这是因为Python的GIL。您可以在此处查看详细信息。

全局解释器锁 (GIL( 是计算机语言解释器中使用的一种机制,用于同步线程的执行,以便一次只能执行一个本机线程。使用 GIL 的解释器始终允许一次只执行一个线程,即使在多核处理器上运行也是如此。

在具有 GIL 的实现上运行的应用程序可以设计为使用单独的进程来实现完全并行性,因为每个进程都有自己的解释器,进而有自己的 GIL。否则,GIL 可能会成为并行性的重大障碍。

为了最大限度地利用您的使用,请使用Python中的多处理。这将在内核数量上分配您的任务,从而利用最大的 CPU。

第二:你的问题大小 数据大小和 CPU 使用率之间存在权衡,如果线程自动生成,则 CPU 使用率将尽可能低,从而保持更长的执行时间。您可以通过处理数据大小来利用所有 CPU 内核来对其进行命令,并查看您的最佳值以及何时应该开始扩展。

最新更新