Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

Pythonエンジニア育成推進協会監修 Python実践レシピ(5)

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