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?
cevap
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.
nedenlebir 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.
Neden? (PyObject *) == 4? '? Bu neyi temsil ediyor? – Matt
@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) –
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. –
12000 elemanları ... Python bir şey değildir ve aslında öğelerin sayısı kadar Python yorumlayıcısı sisteminizde hafızaya sahip olarak gidebilir.
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.
Genel olarak doğru, ancak hepsi değil - ekleme, dizinin boyutundan bağımsız olarak sabit zaman olarak kalır. – cdleary
İlginç, yorum için teşekkürler. –
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.
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. –
@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. –
@dF: Harika! 0.024s benim için çok uzun oldu ve şimdi bunun için endişelenmeyi bırakabildiğime sevindim. –
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.
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
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
liste numarasının sınırlama yoktur. Hatanıza neden olan ana neden RAM'dir. Lütfen bellek boyutunuzu yükseltin.
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. –
- 1. D'de ubyte [] ne kadar büyük olabilir?
- 2. Büyük sayı ne kadar?
- 3. ne kadar veri çizelgesi olabilir js tanıtıcısı
- 4. pprof import overhead ne kadar büyük?
- 5. AsyncStorage React Native olarak ne kadar büyük?
- 6. Bir RSS yayını XML dosyası için ne kadar büyük büyük?
- 7. Bir çerezin ne kadar büyük bir kısmını oluşturabilir miyim?
- 8. Python programının çalışması ne kadar sürer?
- 9. İskele ne kadar ölçeklenebilir?
- 10. XPathNavigator ve XmlReader arasındaki hız farkı ne kadar büyük?
- 11. Değere göre büyük yapılar ne kadar verimli geçebilir?
- 12. Başlık içeren bir IP paket çerçevesi ne kadar büyük?
- 13. Python int float'a dönüştürülemeyecek kadar büyük olup olmadığını kontrol edin
- 14. PHP'nin substr ne kadar verimli?
- 15. Ne kadar akıllıca
- 16. Postgres'te büyük bir TEXT alanının ne kadar büyük olduğunu nasıl öğrenebilirim?
- 17. Web.sitemap'ın bulunamamasına ne sebep olabilir?
- 18. Çöp toplayıcının ne kadar zaman kullandığını?
- 19. Python komut dosyası, ne kadar bellek kullandığını biliyor
- 20. Python: dask dizisi Aşağıda
- 21. MySQL dökümünde ne kadar mesafe var?
- 22. Performans açısından, Guava kütüphanesi ne kadar iyi?
- 23. Captcha Alternatif, ne kadar güvenli?
- 24. Varlık Çerçevesi Ne Kadar Güvenli?
- 25. ne kadar güvenilirdir? Okuduğum kadarıyla
- 26. SIFR: Çok fazla ne kadar?
- 27. Clojure 1.3 ne kadar kararlı?
- 28. Orijinalin ne kadar gerisinde Lucene.Net?
- 29. Chokidar (Node.js) ne kadar verimli?
- 30. Threejs - Buffergeometrilerden ne kadar kazanıyorsunuz?
Python'daki diziler ve listeler arasında büyük bir fark vardır. – recursive