Pada dasarnya, daftar Python sangat fleksibel dan dapat menyimpan data yang sepenuhnya heterogen, sewenang-wenang, dan mereka dapat ditambahkan dengan sangat efisien, dalam waktu konstan yang diamortisasi . Jika Anda perlu mengecilkan dan menumbuhkan daftar Anda secara efisien dan tanpa kerumitan, mereka adalah cara untuk melakukannya. Tapi mereka menggunakan lebih banyak ruang daripada C array .
The array.array
jenis, di sisi lain, hanya bungkus tipis pada C array. Itu hanya dapat menyimpan data homogen, semua dari jenis yang sama, dan hanya menggunakan sizeof(one object) * length
byte memori. Sebagian besar, Anda harus menggunakannya ketika Anda perlu mengekspos array C ke ekstensi atau panggilan sistem (misalnya, ioctl
atau fctnl
).
array.array
juga merupakan cara yang masuk akal untuk mewakili string yang dapat berubah dalam Python 2.x ( array('B', bytes)
). Namun, Python 2.6+ dan 3.x menawarkan byte string yang dapat diubah sebagai bytearray
.
Namun, jika Anda ingin melakukan matematika pada array data numerik yang homogen, maka Anda jauh lebih baik menggunakan NumPy, yang dapat secara otomatis mengubah operasi pada array multi-dimensi yang kompleks.
Untuk membuat cerita panjang pendek : array.array
berguna ketika Anda membutuhkan array data C homogen untuk alasan selain melakukan matematika .
sizeof(element)
× (jumlah elemen) byte, ditambah header kecil yang tetap untuk overhead. Namun, ndarray memiliki beberapa opsi lanjutan untuk berurusan dengan array yang tidak jelas dan jarang, dan saya pikir beberapa strategi pluggable untuk mengalokasikan memori untuk array besar ... beberapa fitur canggih ini akan membuat pengguna lebih sedikit memori, sementara yang lain akan meningkatkan kinerja dengan menggunakan lebih banyak Penyimpanan.Untuk hampir semua kasus, daftar normal adalah pilihan yang tepat. Modul array lebih seperti pembungkus tipis di atas array C, yang memberi Anda jenis wadah yang sangat diketik (lihat dokumen ), dengan akses ke lebih banyak jenis mirip-C seperti bertanda / tidak bertanda pendek atau ganda, yang bukan bagian dari build. dalam tipe. Saya akan mengatakan menggunakan modul array hanya jika Anda benar-benar membutuhkannya, dalam semua kasus tetap dengan daftar.
sumber
array
yang tidak dimaksudkan untuk melakukan matematika . Jika Anda mencoba NumPyndarray
untuk menjumlahkan array 10 ^ 8 angka, itu akan sepenuhnya meledaklist
. @tzot memiliki ide yang tepat tentang mengapa built-inarray
lambat untuk matematika.Modul array adalah salah satu dari hal-hal yang Anda mungkin tidak perlu jika Anda tidak tahu mengapa Anda akan menggunakannya (dan perhatikan bahwa saya tidak mencoba mengatakan itu dengan cara merendahkan!) . Sebagian besar waktu, modul array digunakan untuk berinteraksi dengan kode C. Untuk memberikan jawaban yang lebih langsung untuk pertanyaan Anda tentang kinerja:
Array lebih efisien daripada daftar untuk beberapa kegunaan. Jika Anda perlu mengalokasikan array yang Anda TAHU tidak akan berubah, maka array bisa lebih cepat dan menggunakan lebih sedikit memori. GvR memiliki anekdot optimisasi di mana modul array keluar sebagai pemenang (sudah lama dibaca, tetapi tidak sia-sia).
Di sisi lain, bagian dari alasan mengapa daftar memakan lebih banyak memori daripada array adalah karena python akan mengalokasikan beberapa elemen tambahan ketika semua elemen yang dialokasikan digunakan. Ini berarti menambahkan item ke daftar lebih cepat. Jadi, jika Anda berencana menambahkan item, daftar adalah cara untuk pergi.
TL; DR Saya hanya akan menggunakan array jika Anda memiliki kebutuhan optimasi yang luar biasa atau Anda perlu berinteraksi dengan kode C (dan tidak dapat menggunakan pyrex ).
sumber
kelebihan masing-masing:
daftar
array (ex: numpy array)
sumber
Pemahaman saya adalah bahwa array disimpan lebih efisien (yaitu sebagai blok memori yang berdekatan vs pointer ke objek Python), tetapi saya tidak mengetahui adanya manfaat kinerja. Selain itu, dengan array Anda harus menyimpan primitif dari jenis yang sama, sedangkan daftar dapat menyimpan apa pun.
sumber
Array pustaka standar berguna untuk biner I / O, seperti menerjemahkan daftar ints ke string untuk menulis, katakanlah, file gelombang. Yang mengatakan, seperti banyak yang telah dicatat, jika Anda akan melakukan pekerjaan nyata maka Anda harus mempertimbangkan menggunakan NumPy.
sumber
Jika Anda akan menggunakan array, pertimbangkan paket numpy atau scipy, yang memberi Anda array dengan lebih banyak fleksibilitas.
sumber
Array hanya dapat digunakan untuk tipe tertentu, sedangkan daftar dapat digunakan untuk objek apa pun.
Array juga hanya dapat data dari satu jenis, sedangkan daftar dapat memiliki entri dari berbagai jenis objek.
Array juga lebih efisien untuk beberapa perhitungan numerik.
sumber
Perbedaan penting antara array numpy dan daftar adalah bahwa irisan array adalah tampilan pada array asli. Ini berarti bahwa data tidak disalin, dan setiap modifikasi tampilan akan tercermin dalam larik sumber.
sumber
Jawaban ini akan merangkum hampir semua pertanyaan tentang kapan harus menggunakan Daftar dan Array:
Perbedaan utama antara kedua tipe data ini adalah operasi yang dapat Anda lakukan pada mereka. Misalnya, Anda dapat membagi array dengan 3 dan itu akan membagi setiap elemen array dengan 3. Sama tidak dapat dilakukan dengan daftar.
Daftar ini adalah bagian dari sintaks python sehingga tidak perlu dideklarasikan sedangkan Anda harus mendeklarasikan array sebelum menggunakannya.
Anda bisa menyimpan nilai tipe data yang berbeda dalam daftar (heterogen), sedangkan di Array Anda hanya bisa menyimpan nilai hanya tipe data yang sama (homogen).
Array kaya akan fungsi dan cepat, ini banyak digunakan untuk operasi aritmatika dan untuk menyimpan sejumlah besar data - dibandingkan dengan daftar.
Array mengambil lebih sedikit memori dibandingkan dengan daftar.
sumber
Berkenaan dengan kinerja, berikut adalah beberapa angka yang membandingkan daftar python, array dan array numpy (semua dengan Python 3.7 pada 2017 Macbook Pro). Hasil akhirnya adalah bahwa daftar python tercepat untuk operasi ini.
sumber