Apa perbedaan antara dua baris kode ini:
if not x == 'val':
dan
if x != 'val':
Apakah yang satu lebih efisien daripada yang lain?
Apakah lebih baik digunakan
if x == 'val':
pass
else:
python
if-statement
equality
lafferc
sumber
sumber
Jawaban:
Menggunakan
dis
untuk melihat bytecode yang dihasilkan untuk dua versi:not ==
!=
Yang terakhir memiliki operasi lebih sedikit, dan karena itu cenderung sedikit lebih efisien
Itu ditunjukkan dalam komitmen (terima kasih, @ Quincunx ) bahwa di mana Anda memiliki
if foo != bar
vsif not foo == bar
jumlah operasi persis sama, hanya sajaCOMPARE_OP
perubahan danPOP_JUMP_IF_TRUE
beralih kePOP_JUMP_IF_FALSE
:not ==
:!=
Dalam hal ini, kecuali ada perbedaan dalam jumlah pekerjaan yang diperlukan untuk setiap perbandingan, kecil kemungkinan Anda akan melihat perbedaan kinerja sama sekali.
Namun, perhatikan bahwa kedua versi tidak akan selalu identik secara logis , karena akan tergantung pada implementasi dari
__eq__
dan__ne__
untuk objek yang dimaksud. Per dokumentasi model data :Sebagai contoh:
Akhirnya, dan mungkin yang paling penting: secara umum, di mana dua yang logis identik,
x != y
jauh lebih mudah dibaca daripadanot x == y
.sumber
__eq__
tidak konsisten dengan__ne__
itu benar-benar rusak.not x == y
memiliki satu instruksi lagi. Ketika saya memasukkan kode ke dalamif
, ternyata mereka berdua memiliki jumlah instruksi yang sama, hanya satu yang memilikiPOP_JUMP_IF_TRUE
dan yang lainnyaPOP_JUMP_IF_FALSE
(itu adalah satu-satunya perbedaan di antara mereka, selain menggunakan yang berbedaCOMPARE_OP
). Ketika saya mengkompilasi kode tanpaif
s, saya mendapatkan apa yang Anda dapatkan.==
dan!=
tidak saling eksklusif adalah implementasi SQL-seperti yang melibatkannull
nilai - nilai. Dalam SQLnull
tidak kembalitrue
ke!=
dibandingkan dengan nilai lain, sehingga implementasi python interface SQL mungkin juga memiliki masalah yang sama.not ==
dan!=
, sepertinya itu menjadi bagian paling menarik dari jawabanku! Saya tidak berpikir ini adalah tempat untuk memikirkan jika, mengapa dan kapan itu masuk akal - lihat misalnya Mengapa Python memiliki__ne__
metode operator bukan hanya__eq__
?@jonrsharpe memiliki penjelasan yang bagus tentang apa yang terjadi. Saya pikir saya hanya akan menunjukkan perbedaan waktu ketika menjalankan masing-masing dari 3 opsi 10.000.000 kali (cukup untuk menunjukkan sedikit perbedaan).
Kode yang digunakan:
Dan profil profil cProfile:
Jadi kita dapat melihat bahwa ada perbedaan sangat kecil ~ 0,7% antara
if not x == 'val':
danif x != 'val':
. Dari jumlah tersebut,if x != 'val':
adalah yang tercepat.Namun, yang paling mengejutkan, kita bisa melihatnya
sebenarnya yang tercepat, dan berdetak
if x != 'val':
~ 0,3%. Ini tidak terlalu mudah dibaca, tetapi saya kira jika Anda menginginkan peningkatan kinerja yang dapat diabaikan, orang dapat menempuh rute ini.sumber
Dalam yang pertama Python harus menjalankan satu operasi lebih dari yang diperlukan (bukan hanya memeriksa tidak sama dengan itu harus memeriksa apakah itu tidak benar bahwa itu sama, dengan demikian satu operasi lagi). Tidak mungkin mengatakan perbedaan dari satu eksekusi, tetapi jika dijalankan berkali-kali, yang kedua akan lebih efisien. Secara keseluruhan saya akan menggunakan yang kedua, tetapi secara matematis keduanya sama
sumber
Di sini Anda dapat melihat bahwa
not x == y
memiliki satu instruksi lebih darix != y
. Jadi perbedaan kinerja akan sangat kecil dalam banyak kasus kecuali jika Anda melakukan jutaan perbandingan dan bahkan kemudian ini kemungkinan tidak akan menjadi penyebab kemacetan.sumber
Catatan tambahan, karena jawaban lain menjawab sebagian besar pertanyaan Anda dengan benar, adalah bahwa jika sebuah kelas hanya mendefinisikan
__eq__()
dan tidak__ne__()
, maka AndaCOMPARE_OP (!=)
akan menjalankan__eq__()
dan meniadakannya. Pada saat itu, opsi ketiga Anda cenderung menjadi sedikit lebih efisien, tetapi seharusnya hanya dipertimbangkan jika Anda MEMBUTUHKAN kecepatan, karena sulit untuk dipahami dengan cepat.sumber
Ini tentang cara Anda membacanya.
not
operator itu dinamis, itu sebabnya Anda bisa menerapkannyaTetapi
!=
dapat dibaca dalam konteks yang lebih baik sebagai operator yang melakukan kebalikan dari apa yang==
dilakukan.sumber
not
operator itu dinamis" ?Saya ingin memperluas komentar keterbacaan saya di atas.
Sekali lagi, saya sepenuhnya setuju dengan keterbacaan yang mengesampingkan masalah lain (kinerja-tidak signifikan).
Yang ingin saya tunjukkan adalah otak mengartikan "positif" lebih cepat daripada "negatif". Misalnya, "berhenti" vs. "jangan pergi" (contoh yang agak buruk karena perbedaan jumlah kata).
Jadi diberi pilihan:
lebih disukai daripada yang secara fungsional setara:
Kurang mudah dibaca / dimengerti menyebabkan lebih banyak bug. Mungkin tidak dalam pengkodean awal, tetapi pemeliharaan (tidak sepintar Anda!) Berubah ...
sumber