Cara tercepat untuk memeriksa apakah nilai yang ada di daftar
Apa cara tercepat untuk mengetahui apakah nilai yang ada dalam list (daftar dengan jutaan dari nilai-nilai di dalamnya) dan apa yang index-nya adalah?
Aku tahu bahwa semua nilai-nilai dalam daftar yang unik seperti dalam contoh ini.
Metode pertama yang saya coba adalah (3.8 detik pada kode):
a = [4,2,3,1,5,6]
if a.count(7) == 1:
b=a.index(7)
"Do something with variable b"
Metode kedua yang saya coba adalah (2x lebih cepat: 1.9 detik untuk saya yang sebenarnya kode):
a = [4,2,3,1,5,6]
try:
b=a.index(7)
except ValueError:
"Do nothing"
else:
"Do something with variable b"
Metode yang diusulkan dari Stack Overflow pengguna (2.74 detik untuk saya yang sebenarnya kode):
a = [4,2,3,1,5,6]
if 7 in a:
a.index(7)
Pada kode, metode pertama mengambil 3.81 sec dan metode kedua membutuhkan 1.88 detik. It's sebuah peningkatan yang baik, tetapi:
I'm pemula dengan Python/scripting, dan apakah ada cara yang lebih cepat untuk melakukan hal yang sama dan lebih menghemat waktu proses?
Lebih spesifik penjelasan untuk aplikasi saya:
Di Blender API saya dapat mengakses daftar partikel:
particles = [1, 2, 3, 4, etc.]
Dari sana, saya dapat mengakses partikel's lokasi:
particles[x].location = [x,y,z]
Dan untuk setiap partikel I tes jika seorang tetangga yang ada dengan mencari partikel masing-masing lokasi seperti:
if [x+1,y,z] in particles.location
"Find the identity of this neighbour particle in x:the particle's index
in the array"
particles.index([x+1,y,z])
Yang paling jelas dan tercepat untuk melakukan itu.
Anda juga dapat mempertimbangkan untuk menggunakan
set
, tapi membangun yang membedakan dari daftar anda dapat mengambil lebih banyak waktu lebih cepat dari keanggotaan pengujian akan menyimpan. Satu-satunya cara untuk memastikan adalah untuk acuan baik. (ini juga tergantung pada operasi apa yang anda butuhkan)Seperti yang dinyatakan oleh orang lain,
di
bisa sangat lambat untuk daftar besar. Berikut ini adalah beberapa perbandingan dari pertunjukandi
,set
dandua
. Catat waktu (dalam detik) dalam skala log.Kode untuk pengujian:
Anda bisa menempatkan barang-barang anda ke
set
. Mengatur pencarian yang sangat efisien.Coba:
edit komentar anda mengatakan bahwa anda'd untuk mendapatkan indeks dari elemen. Sayangnya, set tidak memiliki gagasan tentang posisi elemen. Alternatif adalah untuk pra-urutkan daftar anda dan kemudian gunakan pencarian biner setiap waktu yang anda butuhkan untuk menemukan elemen.
Penggunaan ****
Saya percaya ini adalah cara tercepat untuk mengetahui jika a memilih nilai dalam array.
Ini hanya akan menjadi ide yang baik jika doesn't perubahan, dan dengan demikian kita dapat melakukan dict() bagian sekali dan kemudian menggunakannya berulang kali. Jika tidak berubah, mohon berikan detail lebih lanjut tentang apa yang anda lakukan.
Kedengarannya seperti aplikasi anda mungkin mendapatkan keuntungan dari penggunaan Mekar Filter struktur data.
Singkatnya, mekar filter look-up dapat memberitahu anda dengan sangat cepat jika nilai yang PASTI TIDAK hadir dalam satu set. Jika tidak, anda dapat melakukan lebih lambat look-up untuk mendapatkan indeks nilai yang MUNGKIN ada di dalam daftar. Jadi jika aplikasi anda cenderung untuk mendapatkan "tidak ditemukan" hasilnya jauh lebih sering maka "ditemukan" hasilnya, anda mungkin melihat kecepatan dengan menambahkan Mekar Filter.
Untuk rincian, Wikipedia memberikan gambaran yang baik tentang bagaimana Mekar Filter kerja, dan pencarian web untuk "python mekar filter perpustakaan" akan memberikan setidaknya beberapa berguna implementasi.
Diketahui bahwa
dalam
operator tes tidak hanya kesetaraan (==
) tapi juga identitas (adalah
),dalam
logika `daftar ini adalah kira-kira setara dengan berikut (it's benar-benar ditulis dalam C dan tidak Python meskipun, setidaknya di CPython):Dalam sebagian besar keadaan ini detail yang tidak relevan, tetapi dalam beberapa keadaan mungkin meninggalkan Python pemula terkejut, misalnya,
numpy.NAN
memiliki properti yang tidak biasa menjadi tidak sama dengan dirinya sendiri:Untuk membedakan antara kasus ini tidak anda bisa menggunakan
setiap()
seperti:Catatan
di
logikadaftar dengan
setiap()` akan sama:Namun, saya harus menekankan bahwa ini adalah kasus tepi, dan untuk sebagian besar kasus
dalam
operator ini sangat optimal dan tepat apa yang anda inginkan tentu saja (baik dengandaftar
atau denganset
).Atau menggunakan
__memuat__
:Demo:
Ini bukan kode, tetapi algoritma untuk pencarian cepat.
Jika daftar anda dan nilai anda yang mencari semua angka-angka, ini cukup mudah. Jika string: lihat di bawah:
Jika anda juga membutuhkan posisi asli dari nomor anda, mencarinya di kedua, indeks kolom.
Jika daftar ini tidak dibuat dari angka-angka, metode ini masih bekerja dan akan menjadi yang tercepat, tetapi anda mungkin perlu untuk menentukan fungsi yang dapat membandingkan/order string.
Tentu saja, ini membutuhkan investasi diurutkan() metode, tetapi jika anda terus menggunakan kembali daftar yang sama untuk memeriksa, mungkin worth it.
@Winston Ewert's solusi hasil besar kecepatan-up untuk daftar yang sangat besar, tapi ini stackoverflow jawaban menunjukkan bahwa try:/kecuali:/lain: membangun akan melambat jika kecuali cabang lebih sering tercapai. Alternatif adalah untuk mengambil keuntungan dari
.get()
metode untuk dict:`` a = [4,2,3,1,5,6]
indeks = dict((y, x) untuk x, y dalam menghitung(a))
b = indeks.mendapatkan(7, Tidak ada) jika b tidak Tidak ada: "Melakukan sesuatu dengan variabel b" ``
The
.mendapatkan(kunci, default)
metode ini hanya untuk kasus ketika anda dapat't jaminan kunci akan di dict. Jika kunci adalah, ini mengembalikan nilai (seperti yang akandict[key]
), tetapi ketika itu tidak,.get()
mengembalikan nilai default anda (di siniNone
). Anda perlu memastikan bahwa dalam kasus ini yang dipilih default tidak akan dia
.Pertanyaan awal adalah:
Dengan demikian ada dua hal untuk menemukan:
Terhadap hal ini, aku dimodifikasi @xslittlegrass kode untuk menghitung indeks dalam semua kasus, dan menambahkan metode tambahan.
Hasil
Metode ini adalah:
Hasil penelitian menunjukkan bahwa metode 5 tercepat.
Menariknya coba ** dan set** metode yang sama dalam waktu.
Kode Uji
Ini bekerja untuk saya: (daftar pemahaman, satu-liner)
Aku punya
list_to_search_in
dengan semua item, dan ingin mengembalikan indeks dari item dalamlist_from_which_to_search
.Ini kembali dalam berbagai daftar yang bagus.
Bagi saya itu adalah 0.030 detik (real), 0.026 detik (user), dan 0.004 detik (sys).
Kode untuk memeriksa apakah dua elemen ada dalam array yang sama dengan produk k: