Ini adalah pemahaman saya bahwa range()
fungsi, yang sebenarnya merupakan tipe objek di Python 3 , menghasilkan kontennya dengan cepat, mirip dengan generator.
Karena itu, saya akan mengharapkan baris berikut untuk mengambil jumlah waktu banyak, karena untuk menentukan apakah 1 kuadriliun berada dalam kisaran, nilai kuadriliun harus dihasilkan:
1000000000000000 in range(1000000000000001)
Lebih lanjut: tampaknya tidak peduli berapa banyak angka nol yang saya tambahkan, perhitungannya kurang lebih sama dengan waktu (pada dasarnya instan).
Saya juga sudah mencoba hal-hal seperti ini, tetapi perhitungannya masih hampir instan:
1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens
Jika saya mencoba menerapkan fungsi rentang saya sendiri, hasilnya tidak begitu bagus !!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
Apa yang range()
dilakukan objek di bawah kap yang membuatnya begitu cepat?
Jawaban Martijn Pieters dipilih untuk kelengkapannya, tetapi juga melihat jawaban pertama abarnert untuk diskusi yang baik tentang apa artinya range
menjadi urutan penuh dalam Python 3, dan beberapa informasi / peringatan mengenai potensi inkonsistensi untuk __contains__
optimasi fungsi di seluruh implementasi Python . jawaban lain abarnert masuk ke beberapa lebih detail dan menyediakan tautan bagi mereka yang tertarik pada sejarah di balik optimasi di Python 3 (dan kurangnya optimasi xrange
di Python 2). Jawaban oleh poke dan oleh wim memberikan kode sumber C yang relevan dan penjelasan untuk mereka yang tertarik.
range
generator?
xrange
sama dengan Python3range
?
xrange()
objek tidak memiliki __contains__
metode, sehingga pemeriksaan item harus mengulang semua item. Plus ada beberapa perubahan lain di range()
dalamnya, seperti mendukung slicing (yang lagi-lagi mengembalikan range
objek) dan sekarang juga memiliki count
dan index
metode untuk membuatnya kompatibel dengan collections.Sequence
ABC.
bool
ataulong
tipe, dengan tipe objek lain akan menjadi gila. Coba dengan:100000000000000.0 in range(1000000000000001)