はじめに
多量のデータを扱う場合、どうしても応答時間が長かったりする。
ネットに接続するとき、0.1秒ほどはかかってしまうが、Webスクレイピングのように無数のurlに接続してデータを取り出す場合はその0.1秒が積み重なってものすごい長い時間になる。
ここではマルチスレッドPool
を利用して自動化の時間を短縮することをまとめた。
環境
window 10
python 3.7.8
Code
import requests
import time
# 開始時間
start_time = time.time()
# 100個分urlを用意した
url_list = [f'https://finance.yahoo.co.jp/quote/{x}.T' for x in range(5000, 5099)]
def get_data(url: str):
data = requests.get(url)
return data.status_code
普通モード
result = map(get_data, url_list)
print(list(result))
run_time = time.time() - start_time
print(run_time)
[404, 404, 200, 404, 404, 404, 404, 200, 200, 200, 200, 200, 200, 200, 404, 200, 404, 200, 200, 200, 200, 200, 404, 404, 404, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 404, 200, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 200, 200, 404, 404, 200, 404, 200, 404, 200, 200, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404]
15.092657089233398
マルチスレッド
from multiprocessing.dummy import Pool as ThreadPool
# スレッド4つ
pool = ThreadPool(4)
result = pool.map(get_data, url_list)
print(list(result))
run_time = time.time() - start_time
print(run_time)
[404, 404, 200, 404, 404, 404, 404, 200, 200, 200, 200, 200, 200, 200, 404, 200, 404, 200, 200, 200, 200, 200, 404, 404, 404, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 404, 200, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 200, 200, 404, 404, 200, 404, 200, 404, 200, 200, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404]
4.0459582805633545
まとめ
普通モード(スレッド1つ):約15秒
マルチスレッド(スレッド4つ):約4秒
4つのスレッドを利用したことによって処理速度が約4倍になったことが見える。
urlのように、応答時間が不明、もしくは長い場合に活用するとよいと思われる。
私は実際にpandasで異なる条件で検索していくとき、マルチスレッドを利用してデータを取り出すまでの時間をかなり短縮している
関連