529

通常のPythonリストに対するNumPyの利点は何ですか?

約100の金融市場シリーズがあり、100x100x100=100万セルのキューブ配列を作成します。配列を標準誤差で埋めるために、各xを各yおよびzで回帰(3変数)します。

「大きなマトリックス」の場合、パフォーマンスとスケーラビリティの理由から、PythonリストではなくNumPyを使用する必要があると聞いています。実は、私はPythonリストを知っていて、それらは私のために機能しているようです。

NumPyに移行した場合のメリットは何ですか?

1000シリーズ(つまり、キューブ内に10億個の浮動小数点セル)がある場合はどうなりますか?

4

7 に答える 7

793

NumPyの配列はPythonリストよりもコンパクトです。Pythonで説明するリストのリストは少なくとも20MB程度かかりますが、セルに単精度浮動小数点数を含むNumPy3D配列は4MBに収まります。NumPyを使用すると、アイテムの読み取りと書き込みへのアクセスも高速になります。

たぶん、100万セルだけではそれほど気にしないかもしれませんが、10億セルでは間違いなく気になります。どちらのアプローチも、32ビットアーキテクチャには適合しませんが、64ビットビルドでは、NumPyは4GB程度でうまくいきます。 、Pythonだけでも、少なくとも約12 GB(サイズが2倍になる多くのポインター)が必要になります。これは、はるかに高価なハードウェアです。

違いは主に「間接性」によるものです。PythonリストはPythonオブジェクトへのポインターの配列であり、ポインターごとに少なくとも4バイト、さらに最小のPythonオブジェクトの場合は16バイトです(タイプポインターの場合は4、参照カウントの場合は4、4値の場合-メモリアロケータは16に切り上げられます)。NumPy配列は、均一な値の配列です。単精度の数値はそれぞれ4バイト、倍精度の数値は8バイトを取ります。柔軟性は劣りますが、標準のPythonリストの柔軟性にはかなりの費用がかかります。

于 2009-06-14T23:16:23.590 に答える
256

NumPy はより効率的であるだけではありません。また、より便利です。多くのベクトル演算と行列演算を無料で利用できるため、不要な作業を回避できる場合があります。また、それらは効率的に実装されます。

たとえば、キュ​​ーブをファイルから配列に直接読み取ることができます。

x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))

2 番目の次元に沿って合計します。

s = x.sum(axis=1)

しきい値を超えているセルを見つけます。

(x > 0.5).nonzero()

3 番目の次元に沿って偶数インデックスのスライスをすべて削除します。

x[:, :, ::2]

また、多くの便利なライブラリが NumPy 配列で動作します。たとえば、統計分析と視覚化のライブラリです。

パフォーマンスの問題がなくても、NumPy を学ぶことは努力する価値があります。

于 2009-06-14T23:38:50.870 に答える
120

Alex はメモリ効率について、Roberto は利便性について言及しましたが、どちらも良い点です。さらにいくつかのアイデアとして、速度機能性について言及します。

機能性: NumPy、FFT、畳み込み、高速検索、基本統計、線形代数、ヒストグラムなど、多くの機能が組み込まれています。

速度: これは、リストと NumPy 配列の合計を実行するテストで、NumPy 配列の合計が 10 倍高速であることを示しています (このテストでは、走行距離は異なる場合があります)。

from numpy import arange
from timeit import Timer

Nelements = 10000
Ntimeits = 10000

x = arange(Nelements)
y = range(Nelements)

t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
print("numpy: %.3e" % (t_numpy.timeit(Ntimeits)/Ntimeits,))
print("list:  %.3e" % (t_list.timeit(Ntimeits)/Ntimeits,))

私のシステムでは(バックアップを実行している間)、次のようになります。

numpy: 3.004e-05
list:  5.363e-04
于 2009-06-15T04:59:38.843 に答える
48

これは、 scipy.org Web サイトの FAQ からの素晴らしい回答です。

(ネストされた) Python リストよりも NumPy 配列が提供する利点は何ですか?

Python のリストは効率的な汎用コンテナーです。それらは (かなり) 効率的な挿入、削除、追加、および連結をサポートし、Python のリスト内包表記により、それらの作成と操作が容易になります。ただし、特定の制限があります。要素ごとの加算や乗算などの「ベクトル化された」操作をサポートしていません。異なる型のオブジェクトを含めることができるという事実は、Python がすべての要素の型情報を保存し、型ディスパッチ コードを実行する必要があることを意味します。各要素を操作するとき。これは、効率的な C ループで実行できるリスト操作がほとんどないことも意味します。反復ごとに、型チェックやその他の Python API の簿記が必要になります。

于 2014-09-11T02:35:09.107 に答える
0
  • NumPy は別のプログラミング言語ではなく、Python 拡張モジュールです。同種のデータの配列に対して高速で効率的な操作を提供します。Numpy は作成サイズが固定されています。
  • Python では、:lists は角括弧で記述されます。これらのリストは同種または異種の場合があります
  • Python リストよりも Numpy 配列を使用する主な利点:
    1. 消費するメモリが少なくなります。
    2. Python List と比較して高速です。
    3. 使いやすい。
于 2021-10-22T17:55:39.523 に答える