Bir Python Listesi Ne Kadar Büyük Olabilir?


119

Python'da bir liste ne kadar büyük olabilir? Yaklaşık 12000 elementlik bir listeye ihtiyacım var. Sıralama vb. Gibi liste yöntemlerini yine de çalıştırabilecek miyim?

Yanıtlar:


193

Kaynak koduna göre bir listenin maksimum boyutu PY_SSIZE_T_MAX/sizeof(PyObject*).

PY_SSIZE_T_MAXpyport.h olarak tanımlanmıştır((size_t) -1)>>1

Normal bir 32bit sistemde bu (4294967295/2) / 4 veya 536870912'dir.

Bu nedenle, 32 bitlik bir sistemdeki bir python listesinin maksimum boyutu 536,870,912 öğedir .

Sahip olduğunuz elemanların sayısı buna eşit veya bunun altında olduğu sürece, tüm liste işlevleri doğru şekilde çalışmalıdır.


4
Neden sizeof(PyObject*) == 4?? Bu neyi temsil ediyor?
Matt

4
@Matt, bir single'ın bayt sayısıdır PyObject *. Bu şey sözde bir işaretçi (sonunda yıldız işareti yüzünden onları tanıyorsunuz). İşaretçiler 4 bayt uzunluğundadır ve tahsis edilen nesneye bir bellek adresi depolar. Bunlar "sadece" 4 bayt uzunluğundadır, çünkü 4 bayt ile günümüz bilgisayarlarının belleğindeki her elemanı adresleyebilirsiniz.
Antonio Ragagnin

1
Álvaro Justen'in cevabının işaret ettiği gibi, diğer makinelerde, özellikle 64-bit sistemleri çalıştıranlarda, PY_SSIZE_T_MAXkutunun değerinin çok büyük olduğunu belirtmek gerekir .
ClydeTheGhost

@ClydeTheGhost, 64-bit sistemleri çalıştıranların 536,870,912 elemanlarından daha küçük bir maksimum boyuta sahip olup olmayacağını belirtebilir misin? Veya büyük ölçüde değişebildikleri halde, her zaman 536.870.912 öğeye eşit veya onlardan daha büyük bir maksimum boyuta sahip olduklarını?
en

1
@at 64 bitlik bir sistem için maksimum, her zaman 32 bitlik bir sisteme eşit veya daha büyük olacaktır.
ClydeTheGhost

72

As Python belgelerine diyor :

sys.maxsize

Platformun Py_ssize_t türü tarafından desteklenen en büyük pozitif tamsayı ve dolayısıyla maksimum boyut listeleri, dizeleri, dicts ve diğer birçok kapsayıcı olabilir.

Bilgisayarımda (Linux x86_64):

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

Bu soruya nasıl cevap
veriyor

11
@ldgorman, sys.maxsizesorunun cevabıdır. Farklı mimariler, farklı maksimumları destekler.
Simon Kuang

2
9223372036854775807 öğeler? Gerçekten mi? Bu, en çok verilen cevaptan da büyük ölçüde farklılık gösterir.
akki

13
@akki kabul edilen cevap 32 bitlik bir sisteme atıfta bulunuyor. 2016 olduğu için, 64 bitlik bir sistemde olduğunuzu varsayacağım ve bu nedenle yanıt doğru
Brian Leach

2
Bu cevap seçilmelidir.
Lokesh

26

Tabii ki tamam. Aslında kendiniz kolayca görebilirsiniz:

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

Bu satırları makinemde çalıştırmak:

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

Ama herkesin söylediği gibi elbette. Dizi ne kadar büyükse işlemler o kadar yavaş olacaktır.


20
Bu şekilde zamanlama yanıltıcı olabilir - çoğu zaman Python yorumlayıcısını başlatmak için harcanır. Daha iyi bir yol ise: python -m timeit.py "l = aralık (12000); l = sıralı (l, ters = Doğru)". Makinemde bu, bu örnek için zamanın yaklaşık 1 / 20'sini veriyor.
dF.

5
@dF, Doğruluk konusunda haklısınız. Bunu not ettiğiniz için teşekkürler. Sadece bir noktayı kanıtlamak istedim. Ve örnek bunu kanıtlıyor.
Nadia Alramli

13
@dF: Harika! 0.024 saniye benim için çok uzundu ve şimdi bunun için endişelenmeyi bırakabildiğim için mutluyum.
Thomas Edleson

6

Sıradan kodda milyonlarca öğe içeren listeler oluşturdum. Python'un liste uygulamasının yalnızca sisteminizdeki bellek miktarına bağlı olduğuna inanıyorum.

Ek olarak, liste metotları / fonksiyonları listenin büyüklüğüne rağmen çalışmaya devam etmelidir.

Performansı önemsiyorsanız, NumPy gibi bir kütüphaneye bakmanız faydalı olabilir .


5

Listeler için performans özellikleri Effbot'ta açıklanmıştır.

Python listeleri aslında hızlı rastgele erişim için vektör olarak uygulanır, bu nedenle konteyner temelde bellekte alan olduğu kadar çok öğeyi tutacaktır. (Listede bulunan işaretçiler için alana ve işaret edilen nesneler için bellekte alana ihtiyacınız vardır.)

Ekleme O(1)(amortize edilmiş sabit karmaşıklık), ancak dizinin ortasına ekleme / silme O(n), listenizdeki öğelerin sayısı arttıkça yavaşlayacak (doğrusal karmaşıklık) yeniden sıralama gerektirecektir .

Karşılaştırma işlemi sınırsız zaman alabileceğinden, sıralama sorunuz daha ayrıntılıdır. Gerçekten yavaş karşılaştırmalar yapıyorsanız, Python'un liste veri türünün hatası olmasa da, uzun zaman alacaktır .

Ters çevirme, listedeki tüm işaretçileri değiştirmek için gereken süreyi alır O(n)(her işaretçiye bir kez dokunduğunuz için zorunlu olarak (doğrusal karmaşıklık)).


4

Python'da 12000 öğe hiçbir şey değildir ... ve aslında öğe sayısı, Python yorumlayıcısının sisteminizde belleğe sahip olduğu kadar ileri gidebilir.


3

Farklı sistemlere göre değişir (RAM'e bağlıdır). Öğrenmenin en kolay yolu

import six six.MAXSIZE 9223372036854775807 Bu , belgelere göre maksimum boyut listve dictde verir


1
bu dokümantasyon değil
Boris

1

Yalnızca mevcut toplam RAM miktarıyla sınırlı olduğunuzu söyleyebilirim. Açıktır ki, dizi ne kadar büyükse, üzerindeki işlemler o kadar uzun sürecektir.


4
Genelde doğrudur, ancak tümü değil - eklenmesi, dizinin boyutundan bağımsız olarak amortize edilmiş sabit süre olarak kalır.
cdleary

0

Bunu bir x64 bit sisteminde buradan aldım: Python 3.7.0b5 (v3.7.0b5: abb8802389, 31 Mayıs 2018, 01:54:01) [MSC v.1913 64 bit (AMD64)] win32'de

görüntü açıklamasını buraya girin


1
Ayrıntıları ve başkalarının kendi sınırlarını nasıl bulabileceklerini biraz genişletirseniz bu harika bir cevap olabilir.
Shayaan

-16

Liste numarasında sınırlama yoktur. Hatanıza neden olan ana sebep RAM'dir. Lütfen bellek boyutunuzu yükseltin.


9
-1 çünkü aslında soruyu cevaplamaz ve aslında yanıltıcıdır çünkü (diğer cevaplarda gösterildiği gibi) listenin gerçekten bir maksimum boyutu vardır.
ClydeTheGhost
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.