Saya mendapat pernyataan if-elif-elif-else yang 99% waktunya, pernyataan else dijalankan:
if something == 'this':
doThis()
elif something == 'that':
doThat()
elif something == 'there':
doThere()
else:
doThisMostOfTheTime()
Konstruksi ini banyak dilakukan , tetapi karena ia melewati setiap kondisi sebelum mencapai kondisi lain, saya merasa ini tidak terlalu efisien, apalagi Pythonic. Di sisi lain, ia perlu mengetahui apakah salah satu kondisi tersebut terpenuhi, jadi tetap harus mengujinya.
Adakah yang tahu jika dan bagaimana hal ini dapat dilakukan dengan lebih efisien atau apakah ini cara terbaik untuk melakukannya?
python
performance
if-statement
kramer65
sumber
sumber
sort
melakukan hal-hal yang menjalankan rantai if / else ... Anda, sehingga semua elemen yang akan cocok dengan salah satu kondisinya ada di satu ujung, dan yang lainnya ada di sisi lain? Jika demikian, Anda dapat melihat apakah itu lebih cepat / lebih elegan atau tidak. Tapi ingat, jika tidak ada masalah kinerja, terlalu dini untuk mengkhawatirkan pengoptimalan.if not something.startswith("th"): doThisMostOfTheTime()
dan melakukan perbandingan lain dielse
klausa.something
, atau apakah perbandingan serupa dilakukan beberapa kali pada nilai yang sama?Jawaban:
Kode...
... sepertinya seharusnya lebih cepat, tetapi sebenarnya lebih lambat daripada konstruksi
if
...elif
...else
, karena harus memanggil fungsi, yang dapat menjadi overhead performa yang signifikan dalam loop yang ketat.Pertimbangkan contoh-contoh ini ...
1.py
2.py
3.py
4.py
... dan catat jumlah waktu CPU yang mereka gunakan ...
... menggunakan waktu pengguna dari
time(1)
.Opsi # 4 memang memiliki overhead memori tambahan untuk menambahkan item baru untuk setiap kehilangan kunci yang berbeda, jadi jika Anda mengharapkan sejumlah kesalahan kunci berbeda yang tidak terbatas, saya akan menggunakan opsi # 3, yang masih merupakan peningkatan yang signifikan pada konstruksi aslinya.
sumber
dict
lebih lambat, tetapi pengaturan waktu Anda benar-benar menunjukkan bahwa ini adalah opsi tercepat kedua.dict.get()
lebih lambat, yang2.py
- paling lambat dari semuanya.Saya akan membuat kamus:
Sekarang gunakan saja:
Jika
something
tidak ditemukan dioptions
dict makadict.get
akan mengembalikan nilai defaultdoThisMostOfTheTime
Beberapa perbandingan waktu:
Naskah:
Hasil:
Untuk
10**5
kunci yang tidak ada dan 100 kunci yang valid ::Jadi, untuk kamus normal memeriksa penggunaan kunci
key in options
adalah cara paling efisien di sini:sumber
options = collections.defaultdict(lambda: doThisMostOfTheTime, {'this': doThis,'that' :doThat, 'there':doThere}); options[something]()
sedikit lebih efisien.options
dict untuk menghindari membangunnya kembali, sehingga memindahkan sebagian (tetapi tidak semua) logika jauh dari titik penggunaan. Tetap saja, trik yang bagus!try: options[key]() except KeyError: doSomeThingElse()
(karena denganif key in options: options[key]()
Anda menelusuri kamus dua kalikey
Apakah Anda dapat menggunakan pypy?
Menyimpan kode asli Anda tetapi menjalankannya di pypy memberikan kecepatan 50x bagi saya.
CPython:
Pypy:
sumber
Berikut contoh jika dengan kondisi dinamis diterjemahkan ke kamus.
Ini adalah cara, tetapi mungkin bukan cara paling pythonic untuk melakukannya karena kurang terbaca bagi mereka yang tidak fasih dengan Python.
sumber
Orang-orang memperingatkan tentang
exec
alasan keamanan, tetapi ini adalah kasus yang ideal untuk itu.Ini adalah mesin negara yang mudah.
sumber