Penasaran dengan pertanyaan tentang loop tak terbatas dalam perl: while (1) Vs. untuk (;;) Apakah ada perbedaan kecepatan? , Saya memutuskan untuk menjalankan perbandingan serupa dengan python. Saya berharap bahwa kompiler akan menghasilkan kode byte yang sama untuk while(True): pass
dan while(1): pass
, tetapi ini sebenarnya tidak terjadi di python2.7.
Script berikut ini:
import dis
def while_one():
while 1:
pass
def while_true():
while True:
pass
print("while 1")
print("----------------------------")
dis.dis(while_one)
print("while True")
print("----------------------------")
dis.dis(while_true)
menghasilkan hasil sebagai berikut:
while 1
----------------------------
4 0 SETUP_LOOP 3 (to 6)
5 >> 3 JUMP_ABSOLUTE 3
>> 6 LOAD_CONST 0 (None)
9 RETURN_VALUE
while True
----------------------------
8 0 SETUP_LOOP 12 (to 15)
>> 3 LOAD_GLOBAL 0 (True)
6 JUMP_IF_FALSE 4 (to 13)
9 POP_TOP
9 10 JUMP_ABSOLUTE 3
>> 13 POP_TOP
14 POP_BLOCK
>> 15 LOAD_CONST 0 (None)
18 RETURN_VALUE
Menggunakan while True
terasa lebih rumit. Kenapa ini?
Dalam konteks lain, python bertindak seolah-olah True
sama dengan 1:
>>> True == 1
True
>>> True + True
2
Mengapa while
membedakan keduanya?
Saya perhatikan bahwa python3 mengevaluasi pernyataan menggunakan operasi yang identik:
while 1
----------------------------
4 0 SETUP_LOOP 3 (to 6)
5 >> 3 JUMP_ABSOLUTE 3
>> 6 LOAD_CONST 0 (None)
9 RETURN_VALUE
while True
----------------------------
8 0 SETUP_LOOP 3 (to 6)
9 >> 3 JUMP_ABSOLUTE 3
>> 6 LOAD_CONST 0 (None)
9 RETURN_VALUE
Apakah ada perubahan pada python3 dalam cara mengevaluasi boolean?
Jawaban:
Dalam Python 2.x,
True
ini bukan kata kunci, tetapi hanya konstanta global bawaan yang didefinisikan ke 1 dalambool
tipe. Oleh karena itu penerjemah masih harus memuat kontenTrue
. Dengan kata lain,True
dapat ditetapkan ulang:Dalam Python 3.x ini benar-benar menjadi kata kunci dan konstanta nyata:
dengan demikian penerjemah dapat mengganti
while True:
loop dengan loop tak terbatas.sumber
while 1
danwhile True
identik dengan Python 3?Ini kurang tepat,
karena seseorang masih bisa keluar dari lingkaran. Tetapi memang benar bahwa
else
klausa loop seperti itu tidak akan pernah diakses dengan Python 3. Dan juga benar bahwa menyederhanakan pencarian nilai membuatnya berjalan secepatwhile 1
di Python 2.Perbandingan Kinerja
Mendemonstrasikan perbedaan waktu untuk loop sementara yang tidak sepele:
Mempersiapkan
Python 2
Python 3
Penjelasan
Untuk menjelaskan perbedaannya, dengan Python 2:
tetapi dengan Python 3:
Karena
True
merupakan kata kunci dalam Python 3, penerjemah tidak perlu mencari nilainya untuk melihat apakah seseorang menggantinya dengan nilai lain. Tetapi karena seseorang dapat menetapkanTrue
nilai lain, penerjemah harus mencarinya setiap saat.Kesimpulan untuk Python 2
Jika Anda memiliki ketat, lingkaran lama berjalan di Python 2, Anda mungkin harus menggunakan
while 1:
bukanwhile True:
.Kesimpulan untuk Python 3
Gunakan
while True:
jika Anda tidak memiliki kondisi untuk keluar dari loop Anda.sumber
Ini adalah pertanyaan 7 tahun yang sudah memiliki jawaban yang bagus, tetapi kesalahpahaman dalam pertanyaan, yang tidak dibahas dalam jawaban mana pun, membuatnya berpotensi membingungkan untuk beberapa pertanyaan lain yang ditandai sebagai duplikat.
Faktanya,
while
tidak melakukan sesuatu yang berbeda di sini sama sekali. Ini membedakan1
danTrue
dengan cara yang persis sama seperti+
contoh itu.Berikut 2.7:
Sekarang bandingkan:
Itu memancarkan a
LOAD_GLOBAL (True)
untuk masing-masingTrue
, dan tidak ada yang dapat dilakukan pengoptimal dengan global. Jadi,while
bedakan1
danTrue
untuk alasan yang sama persis+
. (Dan==
tidak membedakannya karena pengoptimal tidak mengoptimalkan perbandingan.)Sekarang bandingkan 3.6:
Di sini, ini memancarkan
LOAD_CONST (True)
untuk kata kunci, yang dapat dimanfaatkan oleh pengoptimal . Jadi,True + 1
tidak membedakan, untuk alasan yang persis samawhile True
tidak. (Dan==
masih tidak membedakannya karena pengoptimal tidak mengoptimalkan perbandingan.)Sementara itu, jika kode tidak dioptimalkan, penerjemah akhirnya memperlakukan
True
dan1
persis sama di ketiga kasus ini.bool
adalah subkelas dariint
, dan mewarisi sebagian besar metodenya dariint
, danTrue
memiliki nilai bilangan bulat internal 1. Jadi, baik Anda melakukanwhile
tes (__bool__
dalam 3.x,__nonzero__
dalam 2.x), perbandingan (__eq__
), atau aritmatika (__add__
), Anda memanggil metode yang sama apakah Anda menggunakanTrue
atau1
.sumber