当前位置: 首页 > 面试题库 >

python多线程比串行慢?

鲜于璞瑜
2023-03-14
问题内容

我正在尝试找出python中的多线程编程。这是我要比较串行和并行速度的简单任务。

import threading
import Queue
import time
import math

def sinFunc(offset, n):
  result = []
  for i in range(n):
    result.append(math.sin(offset + i * i))
  return result

def timeSerial(k, n):
  t1 = time.time()    
  answers = []
  for i in range(k):
    answers.append(sinFunc(i, n))
  t2 = time.time()
  print "Serial time elapsed: %f" % (t2-t1)

class Worker(threading.Thread):

  def __init__(self, queue, name):
    self.__queue = queue
    threading.Thread.__init__(self)
    self.name = name

  def process(self, item):
    offset, n = item
    self.__queue.put(sinFunc(offset, n))
    self.__queue.task_done()
    self.__queue.task_done()

  def run(self):
    while 1:
        item = self.__queue.get()
        if item is None:
            self.__queue.task_done()
            break
        self.process(item)

def timeParallel(k, n, numThreads):
  t1 = time.time()    
  queue = Queue.Queue(0)
  for i in range(k):
    queue.put((i, n))
  for i in range(numThreads):
    queue.put(None)    
  for i in range(numThreads):
    Worker(queue, i).start()
  queue.join()
  t2 = time.time()
  print "Serial time elapsed: %f" % (t2-t1)

if __name__ == '__main__':

  n = 100000
  k = 100
  numThreads = 10

  timeSerial(k, n)
  timeParallel(k, n, numThreads)

#Serial time elapsed: 2.350883
#Serial time elapsed: 2.843030

有人可以向我解释发生了什么吗?我已经习惯了C ++,使用该模块的类似版本可以看到我们期望的加速。


问题答案:

其他答案已经提到GIL问题是cpython中的问题。但是我感到那里缺少一些信息。在线程中运行的代码受CPU约束的情况下,这将导致性能问题。就您的情况而言,是的,在线程中执行许多计算很可能会导致性能急剧下降。

但是,如果您执行的操作受到IO的更多限制,例如从网络应用程序中的许多套接字读取数据,或者调出子进程,则可以从线程中获得性能提升。上面的代码的一个简单示例是向外壳程序添加一个愚蠢的简单调用:

import os

def sinFunc(offset, n):
  result = []
  for i in xrange(n):
    result.append(math.sin(offset + i * i))
  os.system("echo 'could be a database query' >> /dev/null; sleep .1")
  return result

调用可能像在文件系统上等待一样真实。但是您可以看到,在此示例中,线程将开始被证明是有益的,因为当线程在等待IO时可以释放GIL,而其他线程将继续处理。即使这样,当创建和同步它们的开销使更多的线程开始被否定时,仍然是一个最佳选择。

对于受CPU约束的代码,您将利用多处理

来自文章:http
:
//www.informit.com/articles/article.aspx?
p=1850445&
seqNum=9


…线程更适合于受I / O约束的应用程序(I / O释放了GIL,从而实现了更多的并发性)…

关于线程与进程的类似问题参考:
http://codingdict.com/questions/159553



 类似资料:
  • 本文向大家介绍Python多线程多进程实例对比解析,包括了Python多线程多进程实例对比解析的使用技巧和注意事项,需要的朋友参考一下 多线程适合于多io操作 多进程适合于耗cpu(计算)的操作 可以看到在耗cpu的应用中,多进程明显优于多线程 2.6130592823028564 < 3.905290126800537 下面模拟一个io操作 可以看到 8.00358772277832 < 8.1

  • 问题内容: 我想检查多线程是否比单线程快,然后在这里进行演示: 首先我用两个sum方法运行singleThreadStart,结果是 然后我运行secondThreadStart,结果是 然后我用五和方法运行singleThreadStart,结果是 最后我运行FiveThreadStart,结果是 我的问题是: SecondThreadStart比singleThreadStart花费更多的时间

  • 我想检查多线程是否比单线程快,然后我在这里做一个演示: 首先,我用二和方法运行singleThreadStart,结果是 然后我运行第二个ThreadStart,结果是 然后我用五和方法运行singleThreadStart,结果是 最后我运行fiveThreadStart,结果是 我的问题是: SecondThreadStart比singleThreadStart花费更多的时间,是因为创建线程的

  • 问题内容: 以下程序与此处描述的程序基本相同。当我使用两个线程(NTHREADS== 2)运行并编译程序时,得到以下运行时间: 当仅使用一个线程(NTHREADS == 1)运行时,即使仅使用一个内核,运行时间也会明显缩短。 我的系统是双核的,我知道random_r是线程安全的,并且我很确定它是非阻塞的。如果在没有random_r的情况下运行同一程序,并且使用余弦和正弦值的计算作为替换,则双线程版

  • 本文向大家介绍理解python多线程(python多线程简明教程),包括了理解python多线程(python多线程简明教程)的使用技巧和注意事项,需要的朋友参考一下 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂。所以,这里力图用简单的例子,让你对多线程有个初步的认识。 单线程   在好些年前的MS-DOS时代,操作系统处理问题都是单任务的,我想做听音乐和看电影两

  • 本文向大家介绍Python中单线程、多线程和多进程的效率对比实验实例,包括了Python中单线程、多线程和多进程的效率对比实验实例的使用技巧和注意事项,需要的朋友参考一下 python的多进程性能要明显优于多线程,因为cpython的GIL对性能做了约束。 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优