Pythonの画像ダウンロードはasync/awaitを使うと3倍速くなった。

sync vs async




Python3.5から登場した非同期処理async/awaitによって、処理速度がどれだけ速くなるか検証したところ、非同期処理によって3倍速くなった。

実験方法

syncおよびasync両方で、10枚の画像のダウンロードを10回試行し、その実行時間を測定した。


syncのソースコード
import requests
import time

t0 = time.time()
for i in range(10):
    res = requests.get('https://vignette.wikia.nocookie.net/disney/images/8/89/Cute-Cat.jpg/revision/latest?cb=20130828113117&format=original')
    with open(str(i) + 'sync.jpg', 'wb') as f:
        for chunk in res.iter_content(1024):
            f.write(chunk)
t1 = time.time()

print("{0} ms".format((t1 - t0) * 1000))


asyncのソースコード
async def print_first_title(i):
    async with aiohttp.ClientSession() as session:
        async with session.get('https://vignette.wikia.nocookie.net/disney/images/8/89/Cute-Cat.jpg/revision/latest?cb=20130828113117&format=original') as resp:
            with open(str(i) + '.jpg', 'wb') as f:
                async for chunk in resp.content.iter_chunked(1024):
                    f.write(chunk)
            
if __name__ == '__main__':
    start = time.time()
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait([print_first_title(i) for i in range(10)]))
    end = time.time()

    print("{0} ms".format((end - start) * 1000))


実験結果



Time to download ten images (ms)
syncasync
1599169
2625183
3640173
4599245
5594228
6598171
7666161
8599165
9688204
10589180
AVERAGE619.7187.9
STDEV34.3318769928.53243768


ディスカッション

今回は、画像10枚を対象としたが、これを100枚などにすると、3倍以上になると推察される。

参考

コメント

このブログの人気の投稿

株式会社GAIAの説明会で驚いた - パチンコホールの売上や給与 -

Python機械学習scikit-learn入門 SVMの学習とクロス・バリデーション (K-fold)