Saya bertanya-tanya apa yang lebih baik untuk dilakukan:
d = {'a': 1, 'b': 2}
'a' in d
True
atau:
d = {'a': 1, 'b': 2}
d.has_key('a')
True
python
dictionary
igorgue
sumber
sumber
keys()
hanya tampilan seperti set ke kamus daripada salinan, begitux in d.keys()
juga O (1). Tetap saja,x in d
ini lebih Pythonic.x in d.keys()
harus membangun dan menghancurkan objek sementara, lengkap dengan alokasi memori yang menyertainya, di manax in d.keys()
hanya melakukan operasi aritmatika (menghitung hash) dan melakukan pencarian. Perhatikan bahwad.keys()
hanya sekitar 10 kali selama ini, yang masih belum terlalu lama. Saya belum memeriksa tetapi saya masih cukup yakin itu hanya O (1).in
menang dengan mudah, tidak hanya dalam keanggunan (dan tidak ditinggalkan ;-) tetapi juga dalam kinerja, misalnya:Meskipun pengamatan berikut tidak selalu benar, Anda akan melihat bahwa biasanya , dalam Python, solusi yang lebih cepat lebih elegan dan Pythonic; itu sebabnya
-mtimeit
sangat membantu - ini bukan hanya tentang menyelamatkan seratus nanodetik di sana-sini! -)sumber
has_key
tampaknya juga O (1).Menurut python docs :
sumber
has_key()
sekarang dihapus dengan Python 3Gunakan
dict.has_key()
jika (dan hanya jika) kode Anda harus dapat dijalankan oleh versi Python lebih awal dari 2.3 (saatkey in dict
diperkenalkan).sumber
Ada satu contoh di mana
in
sebenarnya membunuh kinerja Anda.Jika Anda menggunakan
in
pada wadah O (1) yang hanya mengimplementasikan__getitem__
danhas_key()
tetapi tidak,__contains__
Anda akan mengubah pencarian O (1) menjadi pencarian O (N) (sepertiin
jatuh kembali ke pencarian linear melalui__getitem__
).Perbaikan jelas sepele:
sumber
has_key()
adalah khusus untuk Python 2 kamus .in
/__contains__
adalah API yang benar untuk digunakan; bagi mereka wadah di mana scan penuh tidak dapat dihindari tidak adahas_key()
metode pula , dan jika ada O a (1) pendekatan maka yang akan digunakan-kasus tertentu dan begitu sampai pengembang untuk memilih tipe data yang tepat untuk masalah tersebut.has_key
adalah metode kamus, tetapiin
akan bekerja pada koleksi apa pun, dan bahkan ketika__contains__
hilang,in
akan menggunakan metode lain untuk mengulangi koleksi untuk mengetahuinya.sumber
in
tes padarange
objek. Saya tidak begitu yakin tentang efisiensinya pada Python 2xrange
. ;)__contains__
dapat dengan mudah menghitung apakah suatu nilai berada dalam kisaran atau tidak.range
instance baru setiap kali. Dengan menggunakan contoh tunggal, yang sudah ada sebelumnya , tes "integer in range" sekitar 40% lebih cepat dalam timing saya.Solusi untuk dict.has_key () sudah tidak digunakan lagi, gunakan 'in' - editor teks luhur 3
Di sini saya telah mengambil contoh kamus bernama 'age' -
sumber
Memperluas tes kinerja Alex Martelli dengan komentar Adam Parkin ...
sumber
Jika Anda memiliki sesuatu seperti ini:
ubah ke bawah untuk berjalan di Python 3.X ke atas:
sumber
t.has_key(ew)
kembaliTrue
jikaew
referensi nilai juga merupakan kunci dalam kamus.key not in t
kembaliTrue
jika nilainya tidak ada dalam kamus. Apalagikey = ew
alias sangat, sangat berlebihan. Ejaan yang benar adalahif ew in t
. Itulah jawaban yang diterima dari 8 tahun sebelumnya yang sudah Anda katakan.