加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

发布时间:2019-09-19 14:31:36 所属栏目:优化 来源:skura
导读:副标题#e# 每个数据科学项目迟早都会面临一个不可避免的挑战:速度问题。使用更大的数据集会导致处理速度变慢,因此最终必须想办法优化算法的运行时间。正如你们大多数人已经知道的,并行化是这种优化的必要步骤。python 为并行化提供了两个内置库:多处理

现在让我们在这个任务中引入一些并行性来加快速度。在开始编写代码之前,我们必须在线程和多处理之间做出决定。正如你目前所了解到的,当任务的瓶颈是 IO 时,线程是最好的选择。这里的任务显然属于这一类,因为它正在通过 Internet 访问 IMAP 服务器。所以我们要开始使用线程了。

我们将要使用的大部分代码将与我们在顺序案例中使用的代码相同。唯一不同的是,我们将把 100 个电子邮件 ID 的列表分成 10 个较小的块,每个块包含 10 个 ID,然后创建 10 个线程,并使用每个线程的不同块调用 download_emails 函数。我正在使用 python 标准库中的 concurrent.futures.threadpoolexecutor 类进行线程处理。

  1. import imaplib  
  2. import time  
  3. from concurrent.futures import ThreadPoolExecutor  
  4. IMAP_SERVER = 'imap.gmail.com'  
  5. USERNAME = 'username@gmail.com'  
  6. PASSWORD = 'password'  
  7.  
  8. def download_emails(ids): 
  9.    client = imaplib.IMAP4_SSL(IMAP_SERVER) 
  10.    client.login(USERNAME, PASSWORD) 
  11.    client.select() 
  12.    for i in ids: 
  13.        print(f'Downloading mail id: {i.decode()}') 
  14.        _, data = client.fetch(i, '(RFC822)') 
  15.        with open(f'emails/{i.decode()}.eml', 'wb') as f: 
  16.            f.write(data[0][1]) 
  17.    client.close()  
  18.  
  19. start = time.time()  
  20.  
  21. client = imaplib.IMAP4_SSL(IMAP_SERVER)  
  22. client.login(USERNAME, PASSWORD)  
  23. client.select() 
  24.  
  25. _, ids = client.search(None, 'ALL')  
  26. ids = ids[0].split()  
  27. ids = ids[:100]  
  28. client.close()  
  29.  
  30. number_of_chunks = 10  
  31. chunk_size = 10  
  32. executor = ThreadPoolExecutor(max_workers=number_of_chunks)  
  33. futures = [] 
  34.  
  35. for i in range(number_of_chunks): 
  36.    chunk = ids[i*chunk_size:(i+1)*chunk_size] 
  37.    futures.append(executor.submit(download_emails, chunk)) 
  38.  
  39.  
  40. for future in concurrent.futures.as_completed(futures): 
  41.    pass  
  42. print('Time:', time.time() - start) 

所用时间:9.841094255447388 秒。

如你所见,线程大大加快了它的速度。

场景 2:使用 scikit learn 进行分类

假设你有一个分类问题,你想使用一个随机森林分类器。由于这是一种标准的、众所周知的机器学习算法,我们不需要重新发明轮子,而只需使用 RandomForestClassifier 即可。

以下代码用于演示。我使用助手函数 sklearn.datasets.make_classification 创建了一个分类数据集,然后在此基础上训练了一个 RandomForestClassifier。另外,我正在计时代码中完成模型拟合核心工作的部分。

  1. from sklearn.ensemble import RandomForestClassifier  
  2. from sklearn import datasets  
  3. import time 
  4.  
  5. X, y = datasets.make_classification(n_samples=10000, n_features=50, n_informative=20, n_classes=10)  
  6.  
  7. start = time.time()  
  8. model = RandomForestClassifier(n_estimators=500)  
  9. model.fit(X, y)  
  10. print('Time:', time.time()-start) 

任务花费时间:34.17733192443848 秒。

(编辑:PHP编程网 - 黄冈站长网)

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

热点阅读