【问题标题】:Understand python multithreading by simple math computational problem, How Make it faster codes in python通过简单的数学计算问题理解 python 多线程,如何在 python 中使其代码更快
【发布时间】:2019-05-28 12:50:57
【问题描述】:

我正在尝试理解 python 中的多线程,但是我阅读的每个示例都非常简单且彼此相似,并且不符合我的目的。

我正在执行高级数学计算任务,所以我需要使用 python 多线程。我需要使用多线程而不是多处理来避免内存问题。

您将在下面找到一个我想执行多线程的简单数学问题(不是实际问题,但让我了解线程)。所以我需要在两个不同的线程上同时并行运行task#1(square)和task#2(inve)(等待两者的结果),然后使用两者的结果来获得最终结果回到主线程。

请在 python (Thread, ThreadPool, ThreadPoolExecutor) 中使用任何你喜欢的线程选项,与串行代码相比,真正节省时间和成本

如果有人有更好的想法让这段代码运行得更快,请分享一下

import scipy
import numpy


def square(A):
    # take the square root of a matix
    y = scipy.linalg.sqrtm(A)
    return y

def inve(A):
    # take the inverse of a matrix
    y = numpy.linalg.inv(A)

def main(A):
    # A is a matrix
    # a is the square root of a matrix
    # b is the inverse of a matix

    # Run the first task on one thread
    a = square(A)
    # Run the second task in-parallel in another thread
    b = inve(A)

    # and then run final result in main thread
    result = a * b

    return result

A=[[1,2],[3,4]]
result = main(A)

【问题讨论】:

  • 您在实现多线程时是否遇到任何问题,我们可以提供帮助?
  • 感谢您的回复。是的,我不能完全理解我们如何为类似的例子做线程。例如,如果我使用 threading.Thread,我不知道如何获取输出并等待它。所以,如果你能帮助我并使用我上面解释的多线程重写这段代码。如果你这样做,我真的很感激你。正如我所解释的,我需要并行运行这两个任务,然后等待输出,然后使用两个输出来获得最终结果
  • 由于你没有线程的基础知识,你可以去这里realpython.com/intro-to-python-threading或这里geeksforgeeks.org/multithreading-python-set-1或这里pythonprogramming.net/threading-tutorial-python。您可以在此处获得答案,但它们不会像这些网站提供的这些教程那样完整。
  • CPU 密集型任务不会受益于 Python 中的多线程,除非您使用 Jython 或 IronPython。 CPython 的内存管理不是线程安全的,因此它使用Global Interpreter Lock,线程必须先获取它才能访问 Python 对象。在任何给定时间,只有一个线程可以执行字节码。 CPython 中的线程更适合 I/O 绑定任务。如果需要并行化,应通过多处理来完成 CPU 绑定任务
  • 天啊,我感觉很失落。您能否以您喜欢的任何方式向我展示,您将如何解决这个问题以提高效率并减少时间。请使用您喜欢的任何库重写这个简单的问题,然后我可以在这个库上阅读更多内容,看看它是如何工作的。如果您为我重写它,我将不胜感激。谢谢

标签: python multithreading multiprocessing


【解决方案1】:

这是执行多线程的方法:

import threading
from scipy import linalg
import numpy

x=1
y=1
def square(A):
    global x
    # take the square root of a matix
    x = linalg.sqrtm(A)

def inve(A):
    global y
    y = numpy.linalg.inv(A)

def main(A):
    # creating thread 
    t1 = threading.Thread(target=square, args=(A,)) 
    t2 = threading.Thread(target=inve, args=(A,)) 

    # starting thread 1 
    t1.start() 
    # starting thread 2 
    t2.start() 

    # wait until thread 1 is completely executed 
    t1.join() 
    # wait until thread 2 is completely executed 
    t2.join() 


if __name__ == "__main__":
    A = [[1,2],[3,4]]
    main(A)
    result = x*y
    print(result)

【讨论】:

  • 亲爱的,非常感谢。这真的很有帮助。但是,我已经更改并运行它,但它没有优化时间高于串行代码的时间。无线程(10.85),有线程(11.3)
  • 为什么线程比串行代码需要更长的时间?你能回答我吗!
  • @Zidan,请参阅 Shmee 对您的问题的评论。它谈到了 C-Python 的 Global Interpreter Lock(又名“GIL”)所施加的限制。
  • 感谢所罗门,我阅读并理解了,但仍然不知道如何通过任何方式和任何类型的库来解决这个问题并加快计算速度。你能告诉我你是如何解决这个问题的,以使用你喜欢的任何类型的库来使你的代码更快。请为我重写代码。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2019-08-16
相关资源
最近更新 更多