Jawaban:
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.
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
Bilangan bulat positif terbesar yang didukung oleh jenis Py_ssize_t platform, dan dengan demikian dapat dimiliki daftar ukuran maksimum, string, dicts, dan banyak wadah lainnya.
Di komputer saya (Linux x86_64):
>>> import sys
>>> print sys.maxsize
9223372036854775807
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:
l = range(12000)
l = sorted(l, reverse=True)
Menjalankan garis-garis itu di mesin saya mengambil:
real 0m0.036s
user 0m0.024s
sys 0m0.004s
Tapi pasti seperti yang orang lain katakan. Semakin besar array, semakin lambat operasinya.
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 .
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 ulang O(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).
Ini bervariasi untuk sistem yang berbeda (tergantung pada RAM). Cara termudah untuk mengetahuinya adalah
import six
six.MAXSIZE
9223372036854775807
Ini memberikan ukuran maksimal list
dan dict
juga, sesuai dengan dokumentasi
Saya akan mengatakan Anda hanya dibatasi oleh jumlah total RAM yang tersedia. Jelas semakin besar array, semakin lama operasi di atasnya.
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
Tidak ada batasan nomor daftar. Alasan utama yang menyebabkan kesalahan Anda adalah RAM. Harap tingkatkan ukuran memori Anda.
sizeof(PyObject*) == 4?
? Ini mewakili apa?