Apakah ini daftar tertaut, sebuah array? Saya mencari-cari dan hanya menemukan orang menebak. Pengetahuan C saya tidak cukup baik untuk melihat kode sumber.
182
Apakah ini daftar tertaut, sebuah array? Saya mencari-cari dan hanya menemukan orang menebak. Pengetahuan C saya tidak cukup baik untuk melihat kode sumber.
Ini adalah array dinamis . Bukti praktis: Pengindeksan (tentu saja dengan perbedaan yang sangat kecil (0,0013 µsec!)) Waktu yang sama terlepas dari indeks:
...>python -m timeit --setup="x = [None]*1000" "x[500]"
10000000 loops, best of 3: 0.0579 usec per loop
...>python -m timeit --setup="x = [None]*1000" "x[0]"
10000000 loops, best of 3: 0.0566 usec per loop
Saya akan terkejut jika IronPython atau Jython menggunakan daftar tertaut - mereka akan merusak kinerja banyak banyak perpustakaan yang digunakan secara luas dibangun dengan asumsi bahwa daftar adalah array dinamis.
x=[None]*1000
, meninggalkan pengukuran dari setiap perbedaan akses daftar yang mungkin agak tidak tepat. Anda perlu memisahkan inisialisasi:-s "x=[None]*100" "x[0]"
Kode C sebenarnya cukup sederhana. Memperluas satu makro dan memangkas beberapa komentar yang tidak relevan, struktur dasarnya ada di
listobject.h
, yang mendefinisikan daftar sebagai:PyObject_HEAD
berisi jumlah referensi dan pengenal tipe. Jadi, ini adalah vektor / array yang secara keseluruhan ditempatkan. Kode untuk mengubah ukuran array seperti itu ketika sudah penuhlistobject.c
. Sebenarnya tidak menggandakan array, tetapi tumbuh dengan mengalokasikanuntuk kapasitas setiap kali, di mana
newsize
ukuran yang diminta (tidak harusallocated + 1
karena Anda dapatextend
dengan jumlah elemen yang sewenang-wenang alih-alihappend
mengumpulkannya satu per satu).Lihat juga FAQ Python .
sumber
array
modul atau NumPy lebih disukai.Dalam CPython, daftar adalah array dari pointer. Implementasi lain dari Python dapat memilih untuk menyimpannya dengan cara yang berbeda.
sumber
Ini tergantung pada implementasi, tetapi IIRC:
ArrayList
Dengan demikian mereka semua memiliki O (1) akses acak.
sumber
O(1)
pengindeksan daftar adalah asumsi yang cukup umum dan valid, tidak ada implementasi yang berani melanggarnya.Saya akan menyarankan artikel Laurent Luce "implementasi daftar Python" . Sangat berguna bagi saya karena penulis menjelaskan bagaimana daftar diimplementasikan dalam CPython dan menggunakan diagram yang sangat baik untuk tujuan ini.
...
...
...
...
sumber
aggregation
, bukancomposition
. Saya berharap ada daftar komposisi juga.Menurut dokumentasi ,
sumber
Seperti yang telah dinyatakan oleh orang lain di atas, daftar (ketika cukup besar) dilaksanakan dengan mengalokasikan jumlah ruang yang tetap, dan, jika ruang itu harus diisi, mengalokasikan jumlah ruang yang lebih besar dan menyalin elemen-elemen tersebut.
Untuk memahami mengapa metode ini diamortisasi O (1), tanpa kehilangan sifat umum, asumsikan kita telah memasukkan elemen = 2 ^ n, dan sekarang kita harus menggandakan tabel kita menjadi ukuran 2 ^ (n +1). Itu berarti kami sedang melakukan 2 ^ (n +1) operasi. Salinan terakhir, kami melakukan 2 ^ operasi. Sebelum itu kami melakukan 2 ^ (n-1) ... hingga 8,4,2,1. Sekarang, jika kita tambahkan ini, kita mendapatkan 1 + 2 + 4 + 8 + ... + 2 ^ (n + 1) = 2 ^ (n + 2) - 1 <4 * 2 ^ n = O (2 ^ n) = O (a) total penyisipan (yaitu O (1) waktu diamortisasi). Juga, harus dicatat bahwa jika tabel memungkinkan penghapusan, penyusutan tabel harus dilakukan pada faktor yang berbeda (misalnya 3x)
sumber
Daftar dalam Python adalah sesuatu seperti array, tempat Anda bisa menyimpan banyak nilai. Daftar bisa berubah yang berarti Anda dapat mengubahnya. Hal yang lebih penting yang harus Anda ketahui, ketika kita membuat daftar, Python secara otomatis membuat reference_id untuk variabel daftar itu. Jika Anda mengubahnya dengan menetapkan variabel lain, daftar utama akan berubah. Mari kita coba dengan sebuah contoh:
Kami menambahkan
my_list
tetapi daftar utama kami telah berubah. Daftar mean itu tidak menetapkan sebagai daftar salinan ditugaskan sebagai referensi.sumber
Dalam daftar CPython diimplementasikan sebagai array dinamis, dan karena itu ketika kita menambahkan pada saat itu tidak hanya satu makro ditambahkan tetapi lebih banyak ruang dialokasikan sehingga setiap kali ruang baru tidak boleh ditambahkan.
sumber