「Pythonエンジニア育成推進協会監修 Python実践レシピ(4) - Mae向きなブログ」の続きです。
Chapter 17 デバッグ
ipdb を使ったデバッグをするときに、同じディレクトリに以前作成したdecorator.py
があると、これが悪さをしているようでした。decorator.py
をリネームすると動作するように。
コードの実行時間を計測する
アルゴリズムの違いによる性能差を測るときなどに使いそうなのでメモ。以下は、foo()
関数を10回(number
回)呼んだときにかかる時間を計測している。以下を実行すると、1.045367584
と表示された。
import time import timeit def foo(): time.sleep(0.1) print(timeit.timeit('foo()', globals=globals(), number=10))
Chapter 18 暗号関連
cryptography
は、暗号化、復号を提供するライブラリである。RSAを使用する場合、より深い知識を身につけたうえで使用することが推奨されている。
Chapter 19 並行処理、並列処理
- 逐次処理 着手したタスクを完了させてから、次のタスクに着手する
- 並列処理 複数のタスクを同時に着手する
- 並行処理 着手したタスクを状況に応じて中断し、次のタスクに着手する(asyncioはこれ)
並行処理の練習
1から50までの和を1~10, 11~20, 21~30, 31~40, 41~50の5つのタスクに分けて実行する。それぞれのタスクは、sec
秒かかるようにしている。
import asyncio from time import time async def part_of_sum(f, t, sec): await asyncio.sleep(sec) # 時間がかかる処理 return sum([i for i in range(f, t+1)]) async def main(): start = time() tasks = [ asyncio.create_task(part_of_sum( 1, 10, 3)), # 1から10までの和を3秒かけて求める asyncio.create_task(part_of_sum(11, 20, 2)), # 11から20までの和を2秒かけて求める asyncio.create_task(part_of_sum(21, 30, 1)), # 以下、同様 asyncio.create_task(part_of_sum(31, 40, 5)), asyncio.create_task(part_of_sum(41, 50, 4)) ] results = await asyncio.gather(*tasks) print(f"{sum(results)}") print(f"time: {time() - start}") asyncio.run(main())
それぞれの部分を求めるのに、3秒+2秒+1秒+5秒+4秒かかるので、逐次処理だと15秒かかることになるが、実行してみると5秒で実行できていることから、並行処理ができている。
1275 time: 5.002140998840332