2009-05-12 13 views
88

Python'da bir dizi/liste ne kadar büyük olabilir? Yaklaşık 12000 öğeye ihtiyacım var. Sıralama vb. Gibi dizi/liste yöntemlerini çalıştırabilecek miyim?Python Dizisi Ne Kadar Büyük Olabilir?

+9

Python'daki diziler ve listeler arasında büyük bir fark vardır. – recursive

cevap

149

source code göre, bir liste maksimum boyutu PY_SSIZE_T_MAX/sizeof(PyObject*) olup.

PY_SSIZE_T_MAX düzenli 32bit sisteminde ((size_t) -1)>>1

olmak pyport.h tanımlanmıştır, bu (4294967295/2)/4 veya 536870912.

nedenle

bir 32 bit bir piton listenin en büyük boyutu Sistem 536,870,912 öğeleridir.

sürece sahip öğe sayısı eşit veya bunun altında olduğu gibi, tüm liste fonksiyonları doğru olarak çalışması gerekir.

+2

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

+3

@Matt, tek bir PyObject * 'inin bayt sayısıdır. Bu şey sözde bir işaretçidir (sonunda asteriks nedeniyle bunları tanırsınız). Işaretçiler 4 bayt uzunluğundadır ve ayrılmış bir nesneye bir bellek adresi depolar. Onlar "sadece" 4 bayt uzunluğundadır, çünkü 4 baytta, günümüzde bilgisayarların bir belleğindeki her öğeyi adresleyebilirsiniz. (Álvaro JUSTEN cevabı gösterir gibi) –

+0

O özellikle bu çalışan 64 bit sistemler PY_SSIZE_T_MAX' can çok büyük ölçüde 'değeri diğer makinelerde belirtmek gerekir. –

4

12000 elemanları ... Python bir şey değildir ve aslında öğelerin sayısı kadar Python yorumlayıcısı sisteminizde hafızaya sahip olarak gidebilir.

1

Yalnızca kullanılabilir toplam RAM miktarı ile sınırlı olduğunuzu söyleyebilirim. Açıkçası, dizinin ne kadar büyük olursa, üzerindeki uzun operasyonlar da o kadar uzun sürer.

+3

Genel olarak doğru, ancak hepsi değil - ekleme, dizinin boyutundan bağımsız olarak sabit zaman olarak kalır. – cdleary

+0

İlginç, yorum için teşekkürler. –

24

Elbette sorun değil. Aslında kolayca kendiniz görebilirsiniz:

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

benim makinede bu satırları Koşu aldı: herkes olarak

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

Ama tabii başka belirtti. Dizi ne kadar büyürse operasyonlar o kadar yavaş olur.

+15

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: python -m timeit.py "l = aralık (12000); l = sıralanmış (l, reverse = True)". Makinemde bu, bu örnek için yaklaşık 1/20'si verir. –

+3

@dF, Doğruluk konusunda haklısınız. Bunu söylediğin için teşekkürler. Sadece bir nokta kanıtlamak istedim. Ve örnek bunu kanıtlıyor. –

+8

@dF: Harika! 0.024s benim için çok uzun oldu ve şimdi bunun için endişelenmeyi bırakabildiğime sevindim. –

6

Günlük kodda milyonlarca öğeyle listeler oluşturdum. Python'un listelerin uygulanmasının sadece sisteminizdeki bellek miktarına bağlı olduğuna inanıyorum. Ayrıca liste yöntemleri/işlevleri listenin boyutuna rağmen çalışmaya devam etmelidir.

Performansla ilgileniyorsanız, NumPy gibi bir kitaplığa bakmak faydalı olabilir.

5

Performance characteristics for lists Effbot açıklanmıştır.

Python listeleri aslında hızlı rastgele erişim için vektör olarak uygulanır, bu nedenle kap bellekte yer olduğu için temelde çok sayıda öğe tutacaktır. (Listede yer alan işaretçiler için işaretlenmiş alanların yanı sıra nesne (ler) için işaretlenmiş alan için alan gerekir.)

Ekleme O(1) (amortize sabit karmaşıklık), ancak, ekleme/silme ortasından Sıra, listenizdeki öğe sayısı kadar yavaşlayacak olan O(n) (doğrusal karmaşıklık) yeniden sıralama gerektirir.

Karşılaştırma işlemi sınırsız bir süre alabileceğinden, sıralama sorgunuz daha nüanslıdır. Gerçekten yavaş karşılaştırmalar yapıyorsanız, Python's list data type hatası olmamasına rağmen, uzun bir zaman alacaktır.

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

31

Python documentation says:

sys.maxsize

büyük pozitif Platformun Py_ssize_t türü tarafından desteklenen tamsayı ve böylece maksimum boyut listeleri, dizeleri, dicts ve diğer birçok kaplar can var. bilgisayarıma olarak

(Linux x86_64):

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

bu soruya nasıl cevap veriyor – ldgorman

+3

@ ldgorman, 'sys.maxsize' sorunun cevabı. Farklı mimariler farklı maximaları destekler. –

+0

Sys.maxsize tarafından döndürülen değer, bilgisayardaki kullanılabilir RAM miktarını herhangi bir şekilde yansıtıyor mu? – GeoJohn

-8

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

+1

nedenle doğrudur ve liste gerçekten var mı (diğer cevaplar ile gösterildiği gibi) çünkü aslında yanıltıcıdır üstlenecek en büyük boy. –

İlgili konular