Python 为每个操作创建一个线程,还是为各种操作创建一些线程?

Python 为每个操作创建一个线程,还是为各种操作创建一些线程?,python,multithreading,matrix,distributed,Python,Multithreading,Matrix,Distributed,对于一个类项目,我正在用Python编写一个简单的矩阵乘法器。我的教授要求给它加螺纹。我现在处理这个问题的方法是为每一行创建一个线程,并将结果抛出到另一个矩阵中 我想知道的是,如果不是为每一行创建一个线程,而是创建一些线程,每个线程处理不同的行,是否会更快 例如:给定Matrix1 100x100*Matrix2 100x100(矩阵大小可能变化很大): 4个线程,每个线程处理25行 10个线程,每个线程处理10行 这可能是一个微调问题,或者线程创建过程开销仍然比上述分发机制快。如果对运行应

对于一个类项目,我正在用Python编写一个简单的矩阵乘法器。我的教授要求给它加螺纹。我现在处理这个问题的方法是为每一行创建一个线程,并将结果抛出到另一个矩阵中

我想知道的是,如果不是为每一行创建一个线程,而是创建一些线程,每个线程处理不同的行,是否会更快

例如:给定Matrix1 100x100*Matrix2 100x100(矩阵大小可能变化很大):

  • 4个线程,每个线程处理25行
  • 10个线程,每个线程处理10行

这可能是一个微调问题,或者线程创建过程开销仍然比上述分发机制快。

如果对运行应用程序的计算机上可用的每个CPU核心使用一个线程,则可能会获得最佳性能。如果运行的线程数超过处理器数,则不会获得任何性能优势

如果您计划在每次执行矩阵乘法时生成新线程,那么您的多线程应用程序几乎不可能超越单线程版本,除非您正在乘法非常大的矩阵。相对于乘法矩阵所需的时间而言,创建线程所涉及的开销太高。但是,如果在进程启动时一次性生成所有工作线程,然后反复重用它们以执行许多矩阵乘法,则可以显著提高性能

对于要乘法的每一对矩阵,您需要将被乘数和乘法器矩阵加载到内存中一次,然后允许所有工作线程同时访问内存。这应该是安全的,因为这些矩阵在乘法过程中不会改变

您还应该能够允许所有工作线程同时将其输出写入相同的输出矩阵,因为(由于矩阵乘法的性质)每个线程最终将其输出写入矩阵的不同元素,并且不会有任何争用


我认为应该通过维护一个由所有线程共享的整数
NextRowToProcess
在线程之间分配行。每当一个线程准备处理另一行时,它就会调用
InterlockedIncrement
(或平台上可用的任何原子增量操作),以安全地处理下一行

如果对运行应用程序的计算机可用的每个CPU核心使用一个线程,则可能会获得最佳性能。如果运行的线程数超过处理器数,则不会获得任何性能优势

如果您计划在每次执行矩阵乘法时生成新线程,那么您的多线程应用程序几乎不可能超越单线程版本,除非您正在乘法非常大的矩阵。相对于乘法矩阵所需的时间而言,创建线程所涉及的开销太高。但是,如果在进程启动时一次性生成所有工作线程,然后反复重用它们以执行许多矩阵乘法,则可以显著提高性能

对于要乘法的每一对矩阵,您需要将被乘数和乘法器矩阵加载到内存中一次,然后允许所有工作线程同时访问内存。这应该是安全的,因为这些矩阵在乘法过程中不会改变

您还应该能够允许所有工作线程同时将其输出写入相同的输出矩阵,因为(由于矩阵乘法的性质)每个线程最终将其输出写入矩阵的不同元素,并且不会有任何争用


我认为应该通过维护一个由所有线程共享的整数
NextRowToProcess
在线程之间分配行。每当一个线程准备处理另一行时,它就会调用
InterlockedIncrement
(或平台上可用的任何原子增量操作),以安全地处理下一行

在Python中,在多线程模式下,CPU绑定的任务在任何情况下都不会更快。由于,一次只能执行一个线程(除非编写一些C扩展并显式释放锁)

这适用于标准CPython实现以及PyPy。在Jython中,尝试在每个内核中使用一个线程,更多的线程是没有意义的

请也通过查看伟大的GIL概述


另一方面,如果您的教授不介意,您可以使用。

在任何情况下,在多线程模式下,Python中CPU限制的任务都不会更快。由于,一次只能执行一个线程(除非编写一些C扩展并显式释放锁)

这适用于标准CPython实现以及PyPy。在Jython中,尝试在每个内核中使用一个线程,更多的线程是没有意义的

请也通过查看伟大的GIL概述


另一方面,如果您的教授不介意,您可以使用。

值得一提的是,由于GIL,在纯Python(在CPython、Pypy实现上)中使用线程进行矩阵乘法没有意义。Oops。我的回答就像一个C程序员,不是吗?但如果你决定用真正支持多线程的语言来完成你的类多线程项目,那么这可能会很有用。使用Ironpython或Jython会让我的线程代码超越GIL的限制吗?我正在运行一个无线程版本的程序,即使使用Ironpython,它仍然比线程版本运行得更快。需要修改吗?(我的cpu是corei3)@user1249212:IronPython和Jython没有GIL,所以线程版本可能会提供性能优势