Seberapa Besar Daftar Python?


119

Dengan Python, seberapa besar daftar yang didapat? Saya butuh daftar sekitar 12000 elemen. Apakah saya masih dapat menjalankan metode daftar seperti pengurutan, dll?

Jawaban:


193

Menurut kode sumber , ukuran maksimum daftar adalah PY_SSIZE_T_MAX/sizeof(PyObject*).

PY_SSIZE_T_MAXdidefinisikan 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.


4
Mengapa sizeof(PyObject*) == 4?? Ini mewakili apa?
Matt

4
@Matt, adalah jumlah byte tunggal 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.
Antonio Ragagnin

1
Perlu dicatat (seperti yang ditunjukkan oleh jawaban Álvaro Justen) bahwa pada mesin lain, terutama yang menjalankan sistem 64-bit, nilai dari PY_SSIZE_T_MAXbisa sangat tinggi.
ClydeTheGhost

@ClydeTheGhost, dapatkah Anda menentukan apakah mereka yang menjalankan sistem 64-bit juga dapat memiliki ukuran maksimum yang lebih rendah daripada 536.870.912 elemen? Atau mereka bisa sangat bervariasi, namun selalu memiliki ukuran maksimum yang sama dengan - atau lebih besar dari 536.870.912 elemen?
pada

1
@at Maksimum untuk sistem 64-bit akan selalu sama atau lebih besar dari untuk sistem 32-bit.
ClydeTheGhost

71

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

bagaimana ini menjawab pertanyaan
ldgorman

11
@ldgorman, sys.maxsizeadalah jawaban dari pertanyaan tersebut. Arsitektur yang berbeda mendukung maksima yang berbeda.
Simon Kuang

2
9223372036854775807 elemen? Betulkah? Ini juga sangat bervariasi dari jawaban yang paling disukai.
akki

13
@akki jawaban yang diterima mengacu pada sistem 32 bit. Karena ini 2016, saya akan menganggap Anda menggunakan sistem 64 bit dan oleh karena itu jawabannya benar
Brian Leach

2
Ini harus menjadi jawaban yang dipilih.
Lokesh

26

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.


20
Pengaturan waktu dengan cara ini bisa menyesatkan - sebagian besar waktu dihabiskan untuk memulai penerjemah Python. Cara yang lebih baik adalah: python -m timeit.py "l = range (12000); l = sort (l, reverse = True)". Di komputer saya, ini memberikan sekitar 1/20 waktu untuk contoh ini.
dF.

5
@dF, Anda benar tentang akurasi. Terima kasih telah mencatatnya. Saya hanya ingin membuktikan satu hal. Dan contoh itu membuktikannya.
Nadia Alramli

13
@dF: Luar biasa! 0,024 terlalu lama bagi saya dan saya senang saya bisa berhenti mengkhawatirkan hal itu sekarang.
Thomas Edleson

6

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 .


5

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).


4

12000 elemen bukanlah apa-apa dalam Python ... dan sebenarnya jumlah elemen dapat digunakan sejauh penafsir Python memiliki memori di sistem Anda.


3

Ini bervariasi untuk sistem yang berbeda (tergantung pada RAM). Cara termudah untuk mengetahuinya adalah

import six six.MAXSIZE 9223372036854775807 Ini memberikan ukuran maksimal listdan dictjuga, sesuai dengan dokumentasi


1
itu bukan dokumentasinya
Boris

1

Saya akan mengatakan Anda hanya dibatasi oleh jumlah total RAM yang tersedia. Jelas semakin besar array, semakin lama operasi di atasnya.


4
Umumnya benar, tetapi tidak semuanya - menambahkan waktu tetap diamortisasi tetap independen dari ukuran array.
cdleary

0

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

masukkan deskripsi gambar di sini


1
Ini akan menjadi jawaban yang bagus jika Anda sedikit memperluas detailnya dan bagaimana orang lain dapat menemukan batasan mereka sendiri.
Shayaan

-16

Tidak ada batasan nomor daftar. Alasan utama yang menyebabkan kesalahan Anda adalah RAM. Harap tingkatkan ukuran memori Anda.


9
-1 karena tidak benar-benar menjawab pertanyaan, dan sebenarnya menyesatkan karena daftar (seperti yang ditunjukkan oleh jawaban lain) memang memiliki ukuran yang maksimal.
ClydeTheGhost
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.