Dengan Python, seberapa besar daftar yang didapat? Saya butuh daftar sekitar 12000 elemen. Apakah saya masih dapat menjalankan metode daftar seperti pengurutan, dll?
119
Menurut kode sumber , ukuran maksimum daftar adalah PY_SSIZE_T_MAX/sizeof(PyObject*)
.
PY_SSIZE_T_MAX
didefinisikan dalam pyport.h menjadi((size_t) -1)>>1
Pada sistem 32bit biasa, ini adalah (4294967295/2) / 4 atau 536870912.
Oleh karena itu, ukuran maksimum daftar python pada sistem 32 bit adalah 536.870.912 elemen.
Selama jumlah elemen yang Anda miliki sama atau di bawah ini, semua fungsi daftar harus beroperasi dengan benar.
sizeof(PyObject*) == 4?
? Ini mewakili apa?PyObject *
. Benda itu disebut penunjuk (Anda mengenalinya karena tanda bintang di akhir). Pointer berukuran 4 byte dan menyimpan alamat memori ke objek yang dialokasikan. Mereka "hanya" sepanjang 4 byte karena dengan 4 byte Anda dapat menangani setiap elemen dalam memori komputer saat ini.PY_SSIZE_T_MAX
bisa sangat tinggi.Seperti yang dikatakan dalam dokumentasi Python :
sys.maxsize
Di komputer saya (Linux x86_64):
sumber
sys.maxsize
adalah jawaban dari pertanyaan tersebut. Arsitektur yang berbeda mendukung maksima yang berbeda.Tentu tidak apa-apa. Sebenarnya Anda bisa melihat sendiri dengan mudah:
Menjalankan garis-garis itu di mesin saya mengambil:
Tapi pasti seperti yang orang lain katakan. Semakin besar array, semakin lambat operasinya.
sumber
Dalam kode kasual saya telah membuat daftar dengan jutaan elemen. Saya percaya bahwa implementasi daftar Python hanya dibatasi oleh jumlah memori di sistem Anda.
Selain itu, metode / fungsi daftar harus terus berfungsi terlepas dari ukuran daftar.
Jika Anda peduli dengan kinerja, mungkin ada baiknya untuk melihat ke perpustakaan seperti NumPy .
sumber
Karakteristik kinerja untuk daftar dijelaskan di Effbot.
Daftar Python sebenarnya diimplementasikan sebagai vektor untuk akses acak cepat, jadi wadah pada dasarnya akan menyimpan item sebanyak yang ada di memori. (Anda memerlukan ruang untuk penunjuk yang terdapat dalam daftar serta ruang dalam memori untuk objek yang dituju.)
Menambahkan adalah
O(1)
(kompleksitas konstan diamortisasi), namun, memasukkan ke / menghapus dari tengah urutan akan membutuhkan pengurutan ulangO(n)
(kompleksitas linier), yang akan menjadi lebih lambat seiring dengan jumlah elemen dalam daftar Anda.Pertanyaan pengurutan Anda lebih bernuansa, karena operasi perbandingan dapat memerlukan waktu yang tidak terbatas. Jika Anda melakukan perbandingan yang sangat lambat, itu akan memakan waktu lama, meskipun itu bukan kesalahan tipe data daftar Python .
Pembalikan hanya membutuhkan jumlah waktu yang diperlukan untuk menukar semua penunjuk dalam daftar (tentu saja
O(n)
(kompleksitas linier), karena Anda menyentuh setiap penunjuk sekali).sumber
12000 elemen bukanlah apa-apa dalam Python ... dan sebenarnya jumlah elemen dapat digunakan sejauh penafsir Python memiliki memori di sistem Anda.
sumber
Ini bervariasi untuk sistem yang berbeda (tergantung pada RAM). Cara termudah untuk mengetahuinya adalah
import six six.MAXSIZE 9223372036854775807
Ini memberikan ukuran maksimallist
dandict
juga, sesuai dengan dokumentasisumber
Saya akan mengatakan Anda hanya dibatasi oleh jumlah total RAM yang tersedia. Jelas semakin besar array, semakin lama operasi di atasnya.
sumber
Saya mendapatkan ini dari sini pada sistem x64 bit: Python 3.7.0b5 (v3.7.0b5: abb8802389, 31 Mei 2018, 01:54:01) [MSC v.1913 64 bit (AMD64)] pada win32
sumber
Tidak ada batasan nomor daftar. Alasan utama yang menyebabkan kesalahan Anda adalah RAM. Harap tingkatkan ukuran memori Anda.
sumber