此刻让我们在这个使命中引入一些并行性来加速速率。在开始编写代码之前,我们必需在线程和多处理赏罚之间做出抉择。正如你今朝所相识到的,当使命的瓶颈是 IO 时,线程是最好的选择。这里的使命显然属于这一类,由于它正在通过 Internet 会见 IMAP 处事器。以是我们要开始行使线程了。
我们将要行使的大部门代码将与我们在次序案例中行使的代码沟通。独一差异的是,我们将把 100 个电子邮件 ID 的列表分成 10 个较小的块,每个块包括 10 个 ID,然后建设 10 个线程,并行使每个线程的差异块挪用 download_emails 函数。我正在行使 python 尺度库中的 concurrent.futures.threadpoolexecutor 类举办线程处理赏罚。
- import imaplib
- import time
- from concurrent.futures import ThreadPoolExecutor
- IMAP_SERVER = 'imap.gmail.com'
- USERNAME = 'username@gmail.com'
- PASSWORD = 'password'
-
- def download_emails(ids):
- client = imaplib.IMAP4_SSL(IMAP_SERVER)
- client.login(USERNAME, PASSWORD)
- client.select()
- for i in ids:
- print(f'Downloading mail id: {i.decode()}')
- _, data = client.fetch(i, '(RFC822)')
- with open(f'emails/{i.decode()}.eml', 'wb') as f:
- f.write(data[0][1])
- client.close()
-
- start = time.time()
-
- client = imaplib.IMAP4_SSL(IMAP_SERVER)
- client.login(USERNAME, PASSWORD)
- client.select()
-
- _, ids = client.search(None, 'ALL')
- ids = ids[0].split()
- ids = ids[:100]
- client.close()
-
- number_of_chunks = 10
- chunk_size = 10
- executor = ThreadPoolExecutor(max_workers=number_of_chunks)
- futures = []
-
- for i in range(number_of_chunks):
- chunk = ids[i*chunk_size:(i+1)*chunk_size]
- futures.append(executor.submit(download_emails, chunk))
-
-
- for future in concurrent.futures.as_completed(futures):
- pass
- print('Time:', time.time() - start)
所用时刻:9.841094255447388 秒。
如你所见,线程大大加速了它的速率。
场景 2:行使 scikit learn 举办分类
假设你有一个分类题目,你想行使一个随机丛林分类器。因为这是一种尺度的、众所周知的呆板进修算法,我们不必要从头发现轮子,而只需行使 RandomForestClassifier 即可。
以下代码用于演示。我行使助手函数 sklearn.datasets.make_classification 建设了一个分类数据集,然后在此基本上实习了一个 RandomForestClassifier。其它,我正在计期间码中完成模子拟合焦点事变的部门。
- from sklearn.ensemble import RandomForestClassifier
- from sklearn import datasets
- import time
-
- X, y = datasets.make_classification(n_samples=10000, n_features=50, n_informative=20, n_classes=10)
-
- start = time.time()
- model = RandomForestClassifier(n_estimators=500)
- model.fit(X, y)
- print('Time:', time.time()-start)
使命耗费时刻:34.17733192443848 秒。 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|