【问题标题】:multithreading running slower than single thread?多线程运行比单线程慢?
【发布时间】:2014-11-10 07:45:50
【问题描述】:

我正在尝试分析 Python 中的一个基本函数,以了解多线程在评估其结果方面的比较优势。随着应用函数的数据大小增加,线程版本的性能似乎越来越差。启动线程时是否有我在这里没有考虑的开销?有人可以解释如何实际实现多线程优化/我做错了什么吗?

from multiprocessing import Pool

def f(x):
    return x*x

pool = Pool(processes=4)

import timeit
print timeit.timeit('map(f, range(20000000))', setup = "from __main__ import f", number = 1)
print timeit.timeit('pool.map(f, range(20000000))', setup = "from __main__ import f, pool", number = 1)

结果:

5.90005707741
11.8840620518
[Finished in 18.9s]

如果相关,我会在 Sublime Text 3 中运行它。

【问题讨论】:

  • 您谈论多线程,但您根本不使用线程。我并不是说多处理不好(通常很好!),但您的术语令人困惑。
  • 您有能够处理的 CPU 吗?如果没有,那么就会发生一种模拟多线程。不确定这是否是造成这种情况的原因,但我认为可能
  • 你知道多处理不等于多线程。我想这表现更差的原因(在这种情况下)是你的进程没有做太多,但是在设置进程、与它们通信等方面有很多开销。
  • 我不介意使用线程而不是进程,但我仍然想要一个“映射”函数/希望能够从线程中检索返回值。当我在寻找一种方法时,我被引导到多处理模块。
  • 我认为如果你使用多线程,性能可能会更差——因为你的多线程函数太小了。

标签: python multithreading


【解决方案1】:

您在每项工作中所做的“工作单元”太小了。当您像这样“映射”作业时,这通常是一个问题——映射过程的开销占主导地位。当然,将作业映射到单独的进程比映射到同一进程中更耗时,因此多进程解决方案速度较慢也就不足为奇了。

尝试使用执行更多计算的函数,您将看到多处理的好处。

【讨论】:

    【解决方案2】:

    @john 已经给出了答案,但我也想举个例子

    from multiprocessing import Pool
    
    def f(n):#fibonacci
        if n == 0:
            return 0
        elif n == 1:
            return 1
        else:
            return f(n-1) + f(n-2)
    
    pool = Pool(processes=4)
    
    import timeit
    
    print timeit.timeit('map(f, xrange(35))', setup = "from __main__ import f", number = 1)
    print timeit.timeit('pool.map(f, xrange(35))', setup = "from __main__ import f, pool", number = 1)
    

    结果:

    4.349
    2.497
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2016-04-07
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多