ネイティブ int 型と numpy.int32 型または numpy.int64 型の主な違い (もしあれば) を教えていただけますか?
ベストアンサー1
大きな違いがいくつかあります。まず、Python の整数はサイズが柔軟であることです (少なくとも Python 3.x では)。つまり、任意のサイズの任意の数値を収容できるように拡張できます (もちろん、メモリの制約内で)。一方、NumPy の整数はサイズが固定されています。つまり、保持できる最大値があります。これは、整数のバイト数 (int32
に対してint64
) によって定義され、バイト数が多いほど大きな数値を保持できます。また、数値が符号付きか符号なしか (int32
に対してuint32
) によって定義され、符号なしの場合は大きな数値を保持できますが、負の数値を保持することはできません。
では、なぜ固定サイズの整数を使用するのかと疑問に思うかもしれません。その理由は、最近のプロセッサには固定サイズの整数で計算を行うツールが組み込まれているため、それらの計算ははるかに高速だからです。実際、Python は、数が十分に小さい場合はバックグラウンドで固定サイズの整数を使用し、数が大きくなりすぎた場合にのみ、より遅い柔軟なサイズの整数に切り替えます。
固定サイズの値のもう 1 つの利点は、同じタイプの一貫したサイズの隣接するメモリ ブロックに配置できることです。これは、numpy 配列がデータを格納するために使用する形式です。numpy が依存するライブラリは、この形式のデータに対して非常に高速な計算を実行できます。実際、最新の CPU には、この種の計算を高速化する機能が組み込まれています。可変サイズの Python 整数では、ブロックのサイズを決定できず、データ形式に一貫性がないため、この種の計算は不可能です。
そうは言っても、NumPy は実際には Python 整数の配列を作成できます。ただし、値を含む配列ではなく、実際の Python 整数を保持する他のメモリ部分への参照を含む配列です。これは同じ方法で高速化することはできないため、すべての Python 整数が固定整数サイズ内に収まる場合でも、高速化されません。
Python 2 では、このいずれも当てはまりません。Python 2 では、Python 整数は固定整数であるため、numpy 整数に直接変換できます。可変長整数の場合、Python 2 には 型がありましたlong
。しかし、これは混乱を招き、特にパフォーマンスを必要とするユーザーがいずれにせよ numpy またはそれに類似したものを使用する場合、この混乱はパフォーマンスの向上に見合わないと判断されました。