发 帖  
原厂入驻New
[经验]

Python中的并行性和并发性分析

2020-8-21 17:45:52  203 python 编程语言
分享
0
  在python编程语言当中,很多人对Python中的并行性和并发性不了解。今天我们将讨论python中的并发和并行性www.zpedu.com。在这里,我们将研究Python的多线程,多处理,异步编程,并发和并行性。我们使用python的多处理模块来实现并行性,而Python中的并发是通过线程和异步IO模块来实现的。并行运行的程序将被称为并发,但事实并非如此因此,在不浪费时间的情况下,让我们开始吧。
  平行性
  这意味着要同时以相同的顺序执行多个任务。
  1.多重处理:这意味着将任务分配到CPU内核上[在终端中键入来检查计算机中的内核数。]。对于任何与CPU绑定的任务,我们可以使用python的multiprocessing模块。我们只需在多处理中创建一个Pool对象,即可提供一种便捷的方法来跨多个输入值并行执行函数。让我们借助一个示例来看看它:
  1. <p>  import multiprocessingimport os import time import numpy as npdef
  2. DotProduct(A):</p>
  3. <p>  dot_product = np.dot(A[0],A[1])</p>
  4. <p>  return</p>
  5. <p>  List =
  6. [[np.arange(1000000).reshape(5000,200),np.arange(1000000).reshape(200,5000)],</p>
  7. <p>  [np.arange(1000000).reshape(500,2000),np.arange(1000000).reshape(2000,500)],</p>
  8. <p>  [np.arange(1000000).reshape(5000,200),np.arange(1000000).reshape(200,5000)]]</p>
  9. <p>  if __name__ == "__main__":</p>
  10. <p>  # executing a code without multiprocessing .. ie. on single core .</p>
  11. <p>  start = time.time()</p>
  12. <p>  B = list(map(DotProduct,List))</p>
  13. <p>  end = time.time() - start</p>
  14. <p>  print("Full time taken : " , end , "seconds")</p>
  15. <p>  # lets look at executing same code with multiprocesing module on multiple
  16. cores ..</p>
  17. <p>  start = time.time()</p>
  18. <p>  pool = multiprocessing.cpu_count()</p>
  19. <p>  with multiprocessing.Pool(pool) as p:</p>
  20. <p>  print(p.map(DotProduct,List))</p>
  21. <p>  end = time.time() - start</p>
  22. <p>  print("Full time taken : " , end , "seconds")</p>
复制代码

  ##输出//
  耗时:23.593358993530273秒
  耗时:14.405884027481079秒
  并发
  这意味着同时执行多个任务,但要以重叠或不同或相同的顺序进行。(Python在处理并发方面不是很出色),但是它做得相当不错。
  1.多线程:运行不同/多个线程以在单个处理器上执行任务。多线程对于执行IO绑定任务(例如—同时向服务器发送多个请求等)确实非常有用。创建的每个新线程将具有PID(进程ID),并将具有启动函数。如果要在线程完成其工作后运行loc,可以使用该线程的join()函数。Python与它的GIL有非常复杂的关系,并且代码的输出变化很大。
  2.异步IO:在Python中,异步IO是单线程单进程设计范例,通过某种方式设法实现并发。
  让我们借助一个示例对其进行研究。
  1. <p>  import threadingimport os import time import numpy as npdef
  2. BasicOperation():</p>
  3. <p>  # square of number</p>
  4. <p>  def square(number):</p>
  5. <p>  return number*number</p>
  6. <p>  # cube of a number</p>
  7. <p>  def cube(number):</p>
  8. <p>  return number**3</p>
  9. <p>  # nth power of a number</p>
  10. <p>  def nth_power(number,power):</p>
  11. <p>  return number**power</p>
  12. <p>  # sum of n numbers</p>
  13. <p>  def sum_of_n_numbers(number):</p>
  14. <p>  return number*(number+1)/2</p>
  15. <p>  # using functions to drive a program ...</p>
  16. <p>  print("square of 5 is " , square(5))</p>
  17. <p>  print("cube of 5 is " , cube(5))</p>
  18. <p>  print("5 raise to power 2 is " , nth_power(5,2))</p>
  19. <p>  print("sum of first 5 numbers is" , sum_of_n_numbers(5))</p>
  20. <p>  def DotProduct():</p>
  21. <p>  A = np.arange(1000000).reshape(5000,200)</p>
  22. <p>  B = np.arange(1000000).reshape(200,5000)</p>
  23. <p>  Dot = np.dot(A,B)if __name__ == "__main__":</p>
  24. <p>  # without threading ...</p>
  25. <p>  start = time.time()</p>
  26. <p>  BasicOperation()</p>
  27. <p>  Mid = time.time() - start</p>
  28. <p>  print("Mid time taken : " , Mid , "seconds")</p>
  29. <p>  DotProduct()</p>
  30. <p>  end = time.time() - start</p>
  31. <p>  print("Full time taken : " , end , "seconds")</p>
  32. <p>  # with threading ...</p>
  33. <p>  start = time.time()</p>
  34. <p>  Thread_1 = threading.Thread(target = BasicOperation, name = ' Basic
  35. Operation Thread ')</p>
  36. <p>  Thread_2 = threading.Thread(target = DotProduct , name=' Dot Product Thread
  37. ')</p>
  38. <p>  Thread_1.start()</p>
  39. <p>  Thread_2.start()</p>
  40. <p>  Thread_1.join()</p>
  41. <p>  Mid = time.time() - start</p>
  42. <p>  print("Mid time taken : " , Mid , "seconds")</p>
  43. <p>  Thread_2.join()</p>
  44. <p>  end = time.time() - start</p>
  45. <p>  print("Full time taken : " , end , "seconds")</p>
复制代码

  ##输出//
  5的平方是25
  的5的立方是125
  5 升到幂2是25
  的前5个数字之和是15.0
  耗时:0.0006113052368164062秒
  全时耗:5的平方是10.373110294342041 25seconds
  5的立方是中耗时:1250.0015938282012939453
  5幂2是秒前5个数字的
  25
  总和是15.0
  全时:12.598262786865234秒
  以上就是关于Python中的并行性和并发性的全部内容介绍,想了解更多关于Python的信息,请继续关注我吧。

相关经验

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表