Pythonリストはどのくらい大きくできますか?


119

Pythonでは、リストはどのくらい大きくなりますか?約12000要素のリストが必要です。並べ替えなどのリストメソッドは引き続き実行できますか?

回答:


193

ソースコードによると、リストの最大サイズはPY_SSIZE_T_MAX/sizeof(PyObject*)です。

PY_SSIZE_T_MAXpyport.h次のように定義されています((size_t) -1)>>1

通常の32ビットシステムでは、これは(4294967295/2)/ 4または536870912です。

したがって、32ビットシステムでのPythonリストの最大サイズは536,870,912要素です。

持つ要素の数がこれ以下である限り、すべてのリスト関数は正しく動作するはずです。


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

4
@Mattは、1つののバイト数ですPyObject *。それはいわゆるポインターです(最後にアスタリスクがあるため、それらを認識します)。ポインタは4バイト長で、割り当てられたオブジェクトへのメモリアドレスを格納します。現在のコンピュータのメモリ内のすべての要素をアドレス指定できるので、4バイトの長さは「唯一」です。
Antonio Ragagnin

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

@ ClydeTheGhost、64ビットシステムを実行しているシステムでも、最大サイズを536,870,912要素よりも小さくできるかどうかを指定できますか?または、それらは大きく異なる可能性がありますが、最大サイズは常に536,870,912要素以上です。
で、

1
@at 64ビットシステムの最大値は、常に32ビットシステムの最大値以上になります。
ClydeTheGhost

71

Pythonドキュメント言います

sys.maxsize

プラットフォームのPy_ssize_t型でサポートされる最大の正の整数、つまり最大サイズのリスト、文字列、辞書、およびその他の多くのコンテナーが持つことができる。

私のコンピューター(Linux x86_64):

>>> import sys
>>> print sys.maxsize
9223372036854775807

これはどのように質問に答えますか
ldgorman '29

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

2
9223372036854775807要素?本当に?これは、最も支持されている回答とは大きく異なります。
akki

13
@akki受け入れられた答えは、32ビットシステムに関するものです。それは2016年なので、64ビットシステムを使用していると仮定します。したがって、答えは正しいです
ブライアンリーチ

2
これは答えを選択する必要があります。
ロケシュ

26

確かに大丈夫です。実際、簡単に確認できます。

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

私のマシンでそれらの行を実行すると、

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

しかし、他のみんなが言ったように。配列が大きいほど、操作は遅くなります。


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

5
@dF、あなたは正確さについて正しいです。ご連絡いただきありがとうございます。ポイントを証明したかっただけです。そしてこの例はそれを証明しています。
Nadia Alramli、2009年

13
@dF:すごい!0.024sは私には長すぎたので、今はその心配をやめることができてうれしいです。
Thomas Edleson、2011

6

何気ないコードで、何百万もの要素を含むリストを作成しました。Pythonのリストの実装は、システムのメモリ量によってのみ制限されると思います。

さらに、リストのメソッド/関数は、リストのサイズに関係なく機能し続ける必要があります。

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


5

リストのパフォーマンス特性は Effbotで説明されています。

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

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

比較操作には無制限の時間がかかる可能性があるため、並べ替えの質問はより微妙です。非常に遅い比較を実行している場合は、時間がかかりますが、Pythonのリストデータ型のせいではありません。

反転は、リスト内のすべてのポインターを交換するのに必要な時間を要します(O(n)各ポインターを一度タッチするため、必然的に(線形複雑度))。


4

12000要素はPythonでは何もありません...実際、要素の数は、Pythonインタプリタがシステムにメモリを持っている限り可能です。


3

システムによって異なります(RAMによって異なります)。見つける最も簡単な方法は

import six six.MAXSIZE 9223372036854775807 これは、の最大サイズを与えるlistdictに従って、あまりにドキュメント


1
それはドキュメントではありません
ボリス

1

私はあなたが利用可能なRAMの総量によってのみ制限されていると思います。明らかに、配列が大きいほど、その配列での操作に時間がかかります。


4
一般的には当てはまりますが、すべてではありません-追加は、配列のサイズに関係なく一定の時間で償却されます。
cdleary 2009年

0

私はこれをx64ビットシステムでここから取得しました:win32上のPython 3.7.0b5(v3.7.0b5:abb8802389、May 31 2018、01:54:01)[MSC v.1913 64ビット(AMD64)]

ここに画像の説明を入力してください


1
詳細と他の人が自分の限界を見つける方法を少し広げると、これは素晴らしい答えになります。
Shayaan

-16

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


9
-1は実際には質問に回答せず、実際に誤解を招くためです(他の回答で示されているように)リストには実際に最大サイズがあるためです。
ClydeTheGhost 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.