2009-05-12 12 views
88

Pythonでは、配列/リストはどれくらい大きくできますか?私は約12000要素の配列が必要です。並べ替えなどの配列/リストメソッドを実行することはできますか?Python配列の大きさはどれくらいですか?

+9

Pythonの配列とリストには大きな違いがあります。 – recursive

答えて

149

source codeによれば、リストの最大サイズはPY_SSIZE_T_MAX/sizeof(PyObject*)です。

PY_SSIZE_T_MAXが正規32ビットシステムで((size_t) -1)>>1

ことがpyport.hで定義され、これは(2分の4294967295)/ 4または536870912.

したがって

32ビット上のPythonリストの最大サイズでありますシステムは536,870,912要素です。

あなたが持っている要素の数がこれ以下であれば、すべてのリスト関数が正しく動作するはずです。

+2

なぜ 'sizeof(PyObject *)== 4? 'ですか?これは何を表していますか? – Matt

+3

@Mattは、単一のPyObject *のバイト数です。そのことは、いわゆるポインタです(最後にアステリックスがあるため、それらを認識します)。ポインタは4バイト長で、割り当てられたオブジェクトにメモリアドレスを格納します。 4バイトでは、今日のコンピュータのメモリ内のすべての要素に対処することができるため、「4バイトだけ」です。 –

+0

他のマシン、特に64ビットシステムを実行しているマシンでは、 'PY_SSIZE_T_MAX'の値が非常に大きくなることに注意してください(ÁlvaroJustenの回答によると)。 –

4

12000要素はPythonでは何もありません。実際には、Pythonインタプリタがシステム上にメモリを持つ限り、要素の数は実際には増えます。

1

利用可能なRAMの総量によってのみ制限されていると言えます。明らかに、配列が大きければ大きいほど、それ以上の操作が必要になります。

+3

一般的にはtrueですが、それらのすべてではありません - appendingは、配列のサイズに関係なく、一定の時間を償却したままです。 – cdleary

+0

面白い、コメントありがとう。 –

24

もちろんOKです。実際にあなたが簡単に自分で見ることができます。

実行
l = range(12000) 
l = sorted(l, reverse=True) 

を私のマシン上でこれらの行がかかった:

real 0m0.036s 
user 0m0.024s 
sys 0m0.004s 

しかし、誰もが言ったように確かに。アレイが大きいほど操作は遅くなります。

+15

このようなタイミングは誤解を招く可能性があります。ほとんどの場合、Pythonインタープリタを起動するのに費やされます。より良い方法は:python -m timeit.py "l = range(12000); l =ソート済み(l、reverse = True)"私のマシンでは、これはこの例の約1/20の時間を与えます。 –

+3

@dF、正確さについてはあなたが正しいです。それに気づいてくれてありがとう。私はポイントを証明したかっただけです。そしてこの例はそれを証明します。 –

+8

@dF:恐ろしい! 0.024秒は私にとっては長すぎるし、私は今それについて心配することをやめることができてうれしいです。 –

6

私は数百万の要素を持つリストを作成しました。私は、Pythonのリストの実装はあなたのシステム上のメモリの量によってのみ制限されると考えています。

さらに、リストのメソッド/関数は、リストのサイズにもかかわらず動作し続ける必要があります。

パフォーマンスを気にする人は、NumPyのようなライブラリを調べることをお勧めします。

5

Performance characteristics for listsは、Effbotに記載されている。

Pythonリストは実際には高速ランダムアクセスのベクタとして実装されているため、コンテナには基本的にメモリ内の領域と同じ数のアイテムが保持されます。 (リストに含まれているポインタのスペースと、オブジェクトが指し示すメモリのスペースが必要です。)

追加はO(1)(償却された一定の複雑さ)ですが、中に挿入/削除シーケンスにはO(n)(線形複雑さ)の並べ替えが必要になります。これはリスト内の要素の数よりも遅くなります。

比較操作に無限に時間がかかるため、ソートの質問はより微妙です。あなたが本当に遅い比較を実行している場合、それはPython's list data typeの欠陥ではありませんが、長い時間がかかります。

逆転は、リスト内のすべてのポインタを交換するために必要な時間を要します(各ポインタを1回タッチするため、必然的にO(n)(線形複雑さ))。 Python documentation saysとして

31

sys.maxsize

プラットフォームのPy_ssize_t型タイプでサポートされる最大の正の整数ので、最大サイズのリスト、文字列、dicts、とすることができる多くの他のコンテナ持ってる。私のコンピュータ(のLinux x86_64版)では

>>> import sys 
>>> print sys.maxsize 
9223372036854775807 
+0

これはどのようにして質問に答えますか? – ldgorman

+3

@ ldgorman、 'sys.maxsize'は質問に対する答えです。異なるアーキテクチャが異なる最大値をサポートします。 –

+0

sys.maxsizeによって返される値は、コンピュータで利用可能なRAMの量を何らかの形で反映していますか? – GeoJohn

-8

リスト番号の制限はありません。 エラーを引き起こす主な理由はRAMです。 メモリサイズをアップグレードしてください。

+1

-1です。(他の回答に示されているように)実際には最大サイズ。 –

関連する問題