Yanıtlar:
Kaynak koduna göre bir listenin maksimum boyutu PY_SSIZE_T_MAX/sizeof(PyObject*)
.
PY_SSIZE_T_MAX
pyport.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.
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.
PY_SSIZE_T_MAX
kutunun değerinin çok büyük olduğunu belirtmek gerekir .
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
sys.maxsize
sorunun cevabıdır. Farklı mimariler, farklı maksimumları destekler.
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.
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 .
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)).
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 list
ve dict
de verir
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.
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
Liste numarasında sınırlama yoktur. Hatanıza neden olan ana sebep RAM'dir. Lütfen bellek boyutunuzu yükseltin.
sizeof(PyObject*) == 4?
? Bu neyi temsil ediyor?