yiskw note

機械学習やプログラミングについて気まぐれで書きます

【Python】リストから大きい/小さい順にn個の要素を取り出す

Pythonの標準ライブラリであるheapq.nlargest / heapq.nsmallestを使用することで,
リストから簡単に大きい/小さい順にn個の要素を取り出すことができます.

import heapq
import random


a = [random.randint(0,1000) for _ in range(10)]

print(a)
# [326, 859, 181, 700, 582, 144, 71, 495, 381, 838]

print(heapq.nlargest(2, a))
# [859, 838]

print(heapq.nsmallest(2, a))
# [71, 144]

ただし注意もあり,公式ドキュメントによれば,基本的に一回だけ大きい/小さい順に値を取り出すだけであれば,
配列をソートして取り出した方が高速です.
また最大値/最小値を取り出すのもmax / minの方が高速です.
この処理を複数回行う際に,iterable objectをヒープ化して実行するのが良い,とのことでした.

参考

heapq --- ヒープキューアルゴリズム — Python 3.10.0b2 ドキュメント

【Python】変数の型以外のメタ情報をアノテーションするtyping.Annotated

はじめに

今回はtyping.Annotatedを用いて,変数に型以外のメタ情報もアノテーションする方法について調べたので,こちらにメモを残しておきます.
こちらを使うことで,より可読性の高いコードが書けるようになります

typing.Annotatedとは

typing.Annotatedを用いることで,変数に型以外のメタ情報もアノテーションすることができます.
これらのメタ情報はmypyでは考慮されないもので,単に可読性を向上させることを目的としているようです.

以下の例を考えます.重さと体積から密度を計算する関数です.

def get_density(weight: float, volume: float) -> float:
    return weight / volume

こちらの関数は型アノテーションがされており,一見問題ないように見えますが,weightvolumeの単位がわかりません.
単位の情報を明示するため方法として,コメントに残すのもありですが,typing.Annotatedを使用することで,よりわかりやすくコードを書くことができます.

from typing import Annotated


def get_density(
    weight: Annotated[float, "kg"], volume: Annotated[float, "cubic metre"]
) -> Anntated[float, "kg per cubic metre"]:

    return weight / volume

参考

プロセスの表示をカラフルにわかりやすくするprocs

はじめに

f:id:yiskw713:20220122152302p:plain

今回はpsコマンドの改良版で,プロセスの表示をカラフルにわかりやすくするprocsを使用してみました.
procsは表示をわかりやすくするだけでなく,プロセスの検索なども容易に行うことができ,非常に便利です.
procsの使い方や設定方法について,こちらにメモを残しておきます.

ターミナルで使用できる便利なツールについては,他にも記事を書いておりますので,良ければご参照ください.

yiskw713.hatenablog.com

yiskw713.hatenablog.com

続きを読む