list.append()
adalah pilihan yang jelas untuk ditambahkan ke akhir daftar. Berikut penjelasan yang masuk akal untuk yang hilanglist.prepend()
. Menganggap daftar saya pendek dan masalah kinerja dapat diabaikan, adalah
list.insert(0, x)
atau
list[0:0] = [x]
idiomatis?
Jika Anda bisa menggunakan cara fungsional, berikut ini cukup jelas
Tentu saja Anda belum memasukkan
x
ke dalamnyayour_list
, melainkan Anda telah membuat daftar baru denganx
preprended ke dalamnya.sumber
Anda biasanya tidak ingin berulang-ulang menambahkan daftar ke dalam Python.
Jika pendek , dan Anda tidak sering melakukannya ... maka baiklah.
list.insert
The
list.insert
dapat digunakan dengan cara ini.Tapi ini tidak efisien, karena dalam Python, a
list
adalah array dari pointer, dan Python sekarang harus mengambil setiap pointer dalam daftar dan memindahkannya ke bawah dengan satu untuk memasukkan pointer ke objek Anda di slot pertama, jadi ini benar-benar hanya efisien untuk daftar yang agak pendek, seperti yang Anda minta.Berikut cuplikan dari sumber CPython tempat ini diterapkan - dan seperti yang Anda lihat, kita mulai dari akhir array dan memindahkan semuanya ke bawah satu per setiap penyisipan:
Jika Anda menginginkan sebuah wadah / daftar yang efisien dalam elemen-elemen yang saling bergantung, Anda menginginkan daftar yang ditautkan. Python memiliki daftar tertaut ganda, yang dapat menyisipkan di awal dan akhir dengan cepat - ini disebut a
deque
.deque.appendleft
A
collections.deque
memiliki banyak metode daftar.list.sort
adalah pengecualian, membuatdeque
Liskov pasti tidak sepenuhnya dapat digantilist
.Ini
deque
juga memilikiappendleft
metode (dan jugapopleft
). Inideque
adalah antrian dengan ujung ganda dan daftar yang terhubung ganda - tidak peduli panjangnya, selalu dibutuhkan jumlah waktu yang sama untuk menyiapkan sesuatu. Dalam notasi O besar, O (1) versus O (n) waktu untuk daftar. Inilah penggunaannya:deque.extendleft
Juga relevan adalah metode deque
extendleft
, yang secara iteratif menambahkan:Perhatikan bahwa setiap elemen akan ditambahkan satu per satu, sehingga secara efektif membalik urutannya.
Penampilan dari
list
versusdeque
Pertama kita atur dengan beberapa iterative prepending:
dan kinerja:
Deque jauh lebih cepat. Seiring bertambahnya daftar, saya berharap deque akan tampil lebih baik. Jika Anda dapat menggunakan deque,
extendleft
Anda mungkin akan mendapatkan kinerja terbaik dengan cara itu.sumber
Jika seseorang menemukan pertanyaan ini seperti saya, berikut ini adalah tes kinerja saya terhadap metode yang diusulkan:
Seperti yang Anda lihat,
insert
dan penugasan slice hampir dua kali lebih cepat daripada penambahan eksplisit dan hasilnya sangat dekat. Seperti yang dicatat oleh Raymond Hettingerinsert
adalah opsi yang lebih umum dan saya, secara pribadi lebih suka cara ini untuk masuk daftar.sumber
.insert
dan[0:0] = [0]
bekerja di tempat , mereka masih harus mengalokasikan kembali seluruh buffer.