Saya mengerti bahwa keduanya pada dasarnya adalah hal yang sama, tetapi dalam hal gaya, mana yang lebih baik (lebih Pythonic) yang digunakan untuk membuat daftar kosong atau dikt?
python
performance
list
dictionary
Noah McIlraith
sumber
sumber
list(i for i in range(10) if i % 2)
timeit()
fungsi ini melaporkan jumlah total waktu untuk mengeksekusi sejumlah iterasi tertentu, yang secara1000000
default. Jadi contoh di atas adalah jumlah detik untuk menjalankan cuplikan kode jutaan kali. Misalnyatimeit('dict()', number=1) // -> 4.0531158447265625e-06
(satu iterasi) sementaratimeit('dict()') // -> 0.12412905693054199
(satu juta iterasi)Menurut saya
[]
dan{}
merupakan cara yang paling pythonic dan dapat dibaca untuk membuat daftar kosong / dicts.Berhati-hatilah dengan
set()
itu, misalnya:Bisa membingungkan. Yang pertama membuat sebuah set dengan satu elemen, yang kedua membuat sebuah dict kosong dan bukan sebuah set.
sumber
{}
selalu membuat dikt yang kosong.{1,2,3}
membuat set di 2.7+ tetapi merupakan kesalahan sintaks di2.6
dan versi yang lebih lama.some_epic_set
yang menunjuk kedict
objek kosong ... itu bukan himpunan kosong. Untuk set kosong yang perlu Anda gunakanset()
.{5}
membuat himpunan dengan satu elemen,5
dan{}
merupakan dict kosong.{*()}
untuk mengosongkanset
dengan sintaks literal. Saya menyebutnya operator monyet bermata satu. :-)Dict harfiah mungkin kecil sedikit lebih cepat sebagai bytecode yang lebih pendek:
Hal yang sama berlaku untuk
list
vs.[]
sumber
CALL_FUNCTION
mengambil setidaknya waktu sebanyakBUILD_MAP
(fungsi dipanggil dasarnya adalahBUILD_MAP
), danLOAD_GLOBAL
dibutuhkan hanya tambahan biaya overhead.IMHO, menggunakan
list()
dandict()
membuat Python Anda terlihat seperti C. Ugh.sumber
Dalam kasus perbedaan antara [] dan list (), ada jebakan yang belum pernah saya lihat orang lain tunjukkan. Jika Anda menggunakan kamus sebagai anggota daftar, keduanya akan memberikan hasil yang sangat berbeda:
sumber
[foo_dict]
dengan menggunakanlist((foo_dict,))
. Thelist()
Metode mengambil iterable karena hanya parameter dan iterates di atasnya untuk menambahkan elemen ke dalam daftar. Ini akan menyebabkan kesalahan serupa dengan melakukanlist(some_list)
yang akan meratakan daftar.list () dan [] bekerja secara berbeda:
list () selalu membuat objek baru di heap, tetapi [] dapat menggunakan kembali sel memori karena berbagai alasan.
sumber
ada satu perbedaan dalam perilaku antara [] dan list () seperti yang ditunjukkan contoh di bawah ini. kita perlu menggunakan list () jika kita ingin daftar angka dikembalikan, jika tidak kita mendapatkan objek peta! Tidak yakin bagaimana menjelaskannya.
sumber
Pasangan tanda kurung kotak menunjukkan salah satu objek daftar, atau subskrip indeks, my_List [x].
Pasangan kurung kurawal menunjukkan objek kamus.
a_list = ['hidup', 'mati', 1, 2]
a_dict = {pada: 1, mati: 2}
sumber
Ini terutama masalah pilihan di sebagian besar waktu. Ini masalah preferensi.
Namun perlu diperhatikan bahwa jika Anda memiliki kunci numerik misalnya, Anda tidak dapat melakukan:
Kamu harus melakukan:
sumber
mydict = {1:"foo", 2:"bar"}
(tanpa tanda kutip untuk kunci).