自動化無しに生活無し

WEB開発関係を中心に備忘録をまとめています

  • 【Pillow】画像をまとめてクロッピング(トリミング)する【マルチスレッド高速化】

    自炊した画像データには、余白がある。そこでPillowを使って必要な部分だけトリミングしていく。 ただし、「画像を読み込んで、クロッピング(トリミング)をして保存をする」という処理を、大量に繰り返すのでマルチスレッドで高速化させる。 速度差を意識するため、処理時間も計測する。 まずはforループで直列実行 まずは直列実行してみる。 from PIL import Image import os input_dir = "images" output_dir = "cropped_images" # 出力先が存在しない場合はつくる。 os.makedirs(output_dir, exist_ok=True) # 切り抜き範囲 ...
  • Pythonのthreading.Thread と concurrent.futures.Threadpoolexecutor の違い【マルチスレッド処理】

    Pythonのマルチスレッドには2つの方法がある。 threading.Thread と concurrent.futures.Threadpoolexecutor の2つである。 本記事ではその比較をまとめる 比較項目 threading.Thread Threadpoolexecutor スレッドの管理 自分でスレッドの実行と終了の管理が必要 自動的に管理される 戻り値の扱い 基本取得できない(共有変数などを使う) 取得できる エラーハンドリング 各スレッドでtry-exceptをしなければならない Future.exception() で取得可能 スレッドの起動 個別に起動できる タスクをプールに投げるので、個別にはスレッドの起 ...
  • Ubuntu 24.04 LTS での python仮想環境構築

    Ubuntu 24.04LTS では rootにPythonライブラリをインストールすることはできないようになっている。 $ sudo pip3 install --user virtualenv error: externally-managed-environment × This environment is externally managed ╰─> To install Python packages system-wide, try apt install python3-xyz, where xyz is the package you are trying to install. If you wish to install a non-Debian-packaged Python package, create a virtual environment using python3 -m venv path/to/venv. Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make sure you have python3-full installed. If you wish to install a non-Debian packaged Python application, it may be easiest to use pipx install xyz, which will manage a virtual environment for you. Make sure you have pipx installed. See /usr/share/doc/python3.12/README.venv for more information. note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages. hint: See PEP 668 for the detailed specification. これはDebi ...
  • 【Python】サーボモーターを非同期で動かし、初期化する

    ロボット開発、始めました。 ロボット開発でまず最初にやることは、サーボモーターの初期化。 サーボモーターは工場で作られた時点で、常に角度が0度になっているとは限らない。その状態で90度や-90度の回転を指示してしまうと簡単に壊れる。 そこで、まずはロボットHATのPWMソケットに接続し、サーボモーターを0度に初期化する。 ただし、同期的にしかサーボモーターの制御できないのは問題なので、非同期でサーボモータ ...
  • FastAPIでWebSocketを実現する

    djangoでもWebSocketは実現できるが、依然djangoの一部は同期動作(DB操作とMIDDLEWARE)。 よって、どうしてもボトルネックが発生する。 そこでWebSocketは、djangoではなく、非同期処理を前提として作られたFastAPIに委ねることで、より高速なWebSocketを実現させる。 本記事では、FastAPIを使ってのWebSocketを実現させる。 ただし、セキュリティ ...
  • Pythonで画像認識AI(深層学習)の速習をするためのメモ【pytorchで画像認識学習・推論のサンプルあり】

    急遽AI開発(特に画像認識)が必要になったため、それに必要な用語や概念的なものをまとめる。 ほとんどがChatGPTの受け売りである。自分用にまとめたのでかなり雑であることをお許しいただきたい。 そもそも機械学習と深層学習の違いは? なんとなくだったため、この際はっきりさせる。 機械学習 簡単な表データを学習して推論したい場合、機械学習が有効。 データ量は数千〜数万件単位でOK。特徴量の設定は手動で行う必要が ...
  • Pythonで処理速度のボトルネックを特定する

    Pythonの高速化には、ボトルネックの特定と改善が必要。 本記事ではボトルネックの特定をする。 関数の処理速度を調べるデコレータを用意する 以下のコードの関数をデコレータとして使うことで関数の処理時間を調べることができる。 from functools import wraps import time def timefn(fn): @wraps(fn) def meassure_time(*args, **kwargs): start = time.time() result = fn(*args, **kwargs) print(f"@timefn デコレータより {fn.__name__} : {time.time() - start} 秒") return result return meassure_time try_count = 10000000 @timefn def create_numbers_for(): numbers = [] for i in range(try_count): numbers.append(i) create_numbers_for() このtimefnはデコレータとして機能する。 def timefn(fn): @wraps(fn) def meassure_time(*args, **kwargs): start = time.time() result ...
  • Python非同期プログラミングのルール

    非同期プログラミングには守るべきルールがある。 同期プログラミングと同じように作るとエラーが出るため、ルール・作法をここにまとめる。 非同期処理のルール一覧 I/Oバウンドな同期処理は非同期処理にする 非同期関数を定義するには、async def 非同期関数を実行するには、await 同期関数から非同期関数を実行するには、 asyncio.run() 非同期関数をまとめて実行するには、 asyncio.gather() 同期関数を非同期化させるには、@sync_to_asyn ...
  • 非同期リクエスト vs マルチスレッドリクエスト vs 直列リクエスト

    先の記事でI/Oバウンドの処理は、非同期処理が最適であるとわかった。 本記事では、それがはっきりとわかるコードを用意した。 非同期で大量のリクエストを送信し、レスポンスを受け取る。その処理時間を計測する。 比較のため、マルチスレッド、直列動作のコードも用意した。 使用ライブラリ pip install aiohttp requests fastapi uvicorn aiohappyeyeballs==2.4.4 aiohttp==3.11.11 aiosignal==1.3.2 annotated-types==0.7.0 anyio==4.8.0 async-timeout==5.0.1 attrs==25.1.0 certifi==2024.12.14 charset-normalizer==3.4.1 click==8.1.8 exceptiongroup==1.2.2 fastapi==0.115.7 frozenlist==1.5.0 h11==0.14.0 idna==3.10 multidict==6.1.0 propcache==0.2.1 pydantic==2.10.6 pydantic_core==2.27.2 requests==2.32.3 sniffio==1.3.1 starlette==0.45.3 typing_extensions==4.12.2 urllib3==2.3.0 uvicorn==0.34.0 yarl==1.18.3 非同期リクエストには、aiohttp を使う。通常の requests では非同期リク ...
  • 非同期処理(async、await)とマルチスレッド(threading)とマルチプロセス(multiprocessing)の違い

    FastAPIやWebSocketで非同期処理を扱うようになったため、非同期処理とマルチスレッドとマルチプロセスの違いをまとめる。 この違いは非常に複雑で難解。 まずはPythonのGILについて解説する。 GIL とは? Global Interpreter Lock の略。pythonのCPython実装時に追加された、スレッドの排他制御メカニズムのこと。 このGILの仕組みにより、複数のスレッドがPythonのオブジェクトにアクセスできないようにし ...