加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

想提高计算速度?作为数据科学家你应该知道这些Python多线程、进程知识

发布时间:2019-09-21 02:19:47 所属栏目:建站 来源:skura
导读:每个数据科学项目早晚城市面对一个不行停止的挑衅:速率题目。行使更大的数据会议导致处理赏罚速率变慢,因此最终必需想步伐优化算法的运行时刻。正如你们大大都人已经知道的,并行化是这种优化的须要步调。python 为并行化提供了两个内置库:多处理赏罚和线程。在

GUI 措施始终行使线程来使应用措施相应。譬喻,在文本编辑措施中,一个线程认真记任命户输入,另一个线程认真表现文本,第三个线程认真拼写搜查,等等。在这里,措施必需守候用户交互,这是最大的瓶颈。行使多处理赏罚不会使措施更快。

线程的另一个用例是 io 绑定或收集绑定的措施,譬喻 web-scrapers。在这种环境下,多个线程可以同时处理赏罚多个网页的刮擦。线程必需从 Internet 下载网页,这将是最大的瓶颈,因此线程是一个美满的办理方案。Web 处事器是受收集束缚的,事变道理与此相同;有了它们,多处理赏罚就没有线程的上风了。另一个相干的例子是 tensorflow,它行使线程池并行地转换数据。

多处理赏罚的行使案例

假如措施是 CPU 麋集型的,而且不必要举办任何 IO 或用户交互,那么多处理赏罚就比线程越发突出。譬喻,任何一个只处理赏罚数字的措施都可以行使多处理赏罚获得极大的加快;究竟上,线程也许会减慢它的速率。一个风趣的现实例子是 Pytorch Dataloader,它行使多个子历程将数据加载到 GPU 中。

python 中的并行化

python 为同名的并行化要领提供了两个库——多处理赏罚和线程。尽量它们之间有着基础的区别,但这两个库提供了很是相似的 API(从 python 3.7 开始)。让我们来详细看看吧。

  1. import threading  
  2. import random  
  3. from functools import reduce  
  4.  
  5. def func(number): 
  6.    random_list = random.sample(range(1000000), number) 
  7.    return reduce(lambda x, y: x*y, random_list)  
  8. number = 50000  
  9. thread1 = threading.Thread(target=func, args=(number,))  
  10. thread2 = threading.Thread(target=func, args=(number,))  
  11.  
  12. thread1.start()  
  13. thread2.start()  
  14.  
  15. thread1.join()  
  16. thread2.join() 

你可以看到,我建设了一个函数 func,它建设一个随机数列表,然后按次序将其全部元素相乘。假如物品数目足够大,好比说 5 万或 10 万件,这也许是一个相等沉重的进程。

然后,我建设了两个线程来执行统一个函数。线程工具有一个异步启动线程的 start 要领。假如我们想守候它们终止并返回,我们必需挪用 join 要领,这就是我们在上面所做的。

如你所见,在靠山将新线程转到使命的 API 很是简朴。最棒的是,用于多处理赏罚的 API 也险些完全沟通;让我们来搜查一下吧~

  1. import multiprocessing  
  2. import randomfrom functools  
  3. import reduce  
  4.  
  5. def func(number): 
  6.    random_list = random.sample(range(1000000), number) 
  7.    return reduce(lambda x, y: x*y, random_list) 
  8.  
  9. number = 50000  
  10. process1 = multiprocessing.Process(target=func, args=(number,)) 
  11. process2 = multiprocessing.Process(target=func, args=(number,))  
  12.  
  13. process1.start()  
  14. process2.start()  
  15.  
  16. process1.join()  
  17. process2.join() 

在这里它只是互换线程。有着多处理赏罚的线程。

显然,你可以用它做许多工作,但这不在本文的范畴内,以是我们不在这里接头。假如你有乐趣相识更多信息,请查察这里和这里的文档:https://docs.python.org/3/library/threading.html 和 https://docs.python.org/3/library/threading.html 。

基准点

此刻我们已经相识了实现并行化的代码是什么样子的,让我们回到机能题目上来。如前所述,线程不适实用于 CPU 限定的使命;在这些环境下,它最终成为一个瓶颈。我们可以行使一些简朴的基准来验证这一点。

起首,让我们看看在我上面展示的代码示例中,线程处理赏罚与多处理赏罚是怎样较量的。请记着,此使命不涉及任何范例的 IO,因此它是纯 CPU 绑定的使命。

想进步计较速率?作为数据科学家你应该知道这些Python多线程、历程常识

让我们看看一个 IO 绑定使命的相同基准。譬喻,以下函数:

  1. import requestsdef func(number): 
  2.    url = 'http://example.com/' 
  3.    for i in range(number): 
  4.        response = requests.get(url) 
  5.        with open('example.com.txt', 'w') as output: 
  6.            output.write(response.text) 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读