Rupanya xrange lebih cepat tetapi saya tidak tahu mengapa lebih cepat (dan tidak ada bukti selain anekdot sejauh ini lebih cepat) atau apa selain itu berbeda tentang
for i in range(0, 20):
for i in xrange(0, 20):
Dengan Python 2.x:
range
membuat daftar, jadi jika Anda melakukannya range(1, 10000000)
, buat daftar di memori dengan 9999999
elemen.
xrange
adalah objek urutan yang mengevaluasi malas.
Dalam Python 3, range
apakah setara dengan python xrange
, dan untuk mendapatkan daftar, Anda harus menggunakan list(range(...))
.
xrange(x).__iter__()
adalah generator.i
dievaluasi berdasarkan permintaan daripada inisialisasi.Ini benar, tetapi dalam Python 3,
.range()
akan dilaksanakan oleh Python 2.xrange()
. Jika Anda benar-benar perlu membuat daftar, Anda harus melakukan:sumber
xrange
generator? Ini adalah fungsi yang berisiyield
pernyataan, dan menurut glosarium fungsi-fungsi tersebut disebut generator.Ingat, gunakan
timeit
modul untuk menguji potongan kode kecil mana yang lebih cepat!Secara pribadi, saya selalu menggunakan
.range()
, kecuali aku berhadapan dengan benar daftar besar - seperti yang Anda lihat, waktu-bijaksana, untuk daftar satu juta entri, overhead ekstra hanya 0,04 detik. Dan seperti yang ditunjukkan Corey, dalam Python 3.0.xrange()
akan hilang dan.range()
akan memberi Anda perilaku iterator yang bagus.sumber
python -m timeit "for i in xrange(1000000):" " pass"
the extra overhead is only 0.04 seconds
bukankah cara yang tepat untuk melihatnya,(90.5-51.1)/51.1 = 1.771 times slower
benar karena menyampaikan bahwa jika ini adalah inti dari program Anda, berpotensi dapat menghambatnya. Namun, jika ini adalah bagian kecil maka 1,77x tidak terlalu banyak.xrange
hanya menyimpan rentang params dan menghasilkan angka sesuai permintaan. Namun implementasi C dari Python saat ini membatasi argumennya ke C rindu:Perhatikan bahwa dalam Python 3.0 hanya ada
range
dan berperilaku seperti 2.xxrange
tetapi tanpa batasan pada titik akhir minimum dan maksimum.sumber
xrange mengembalikan iterator dan hanya menyimpan satu nomor dalam memori pada satu waktu. Kisaran menyimpan seluruh daftar nomor dalam memori.
sumber
xrange
tidak tidak mengembalikan iterator.and only keeps one number in memory at a time
dan di mana sisanya ditempatkan tolong bimbing saya ..Luangkan waktu dengan Referensi Perpustakaan . Semakin Anda terbiasa dengannya, semakin cepat Anda dapat menemukan jawaban untuk pertanyaan seperti ini. Terutama penting adalah beberapa bab pertama tentang objek dan tipe builtin.
Cara lain untuk menemukan informasi cepat tentang konstruksi Python adalah docstring dan fungsi bantu:
sumber
Saya terkejut tidak ada yang membaca dokumen :
sumber
Ini memberi Anda dua keuntungan:
MemoryError
.sumber
Anda akan menemukan keuntungan
xrange
lebih darirange
contoh sederhana ini:Contoh di atas tidak mencerminkan sesuatu yang jauh lebih baik jika terjadi
xrange
.Sekarang lihat kasus berikut di mana
range
benar-benar sangat lambat, dibandingkan denganxrange
.Dengan
range
, ia sudah membuat daftar dari 0 hingga 10.000.000 (memakan waktu), tetapixrange
merupakan generator dan hanya menghasilkan angka berdasarkan kebutuhan, yaitu, jika iterasi berlanjut.Dalam Python-3, implementasi
range
fungsionalitasnya sama sepertixrange
pada Python-2, sementara mereka telah dihilangkan denganxrange
Python-3Selamat Coding !!
sumber
Ini untuk alasan optimasi.
range () akan membuat daftar nilai dari awal hingga akhir (0 .. 20 dalam contoh Anda). Ini akan menjadi operasi yang mahal pada rentang yang sangat besar.
xrange () di sisi lain jauh lebih optimal. itu hanya akan menghitung nilai berikutnya ketika dibutuhkan (melalui objek urutan xrange) dan tidak membuat daftar semua nilai seperti rentang () tidak.
sumber
range(x,y)
mengembalikan daftar setiap angka di antara x dan y jika Anda menggunakanfor
loop, makarange
lebih lambat. Bahkan,range
memiliki rentang Indeks yang lebih besar.range(x.y)
akan mencetak daftar semua angka di antara x dan yxrange(x,y)
kembalixrange(x,y)
tetapi jika Anda menggunakanfor
loop, makaxrange
lebih cepat.xrange
memiliki rentang Indeks yang lebih kecil.xrange
tidak hanya akan mencetakxrange(x,y)
tetapi masih akan menyimpan semua nomor yang ada di dalamnya.Jika Anda menggunakan
for
loop, maka itu akan berhasilTidak ada banyak perbedaan saat menggunakan loop, meskipun ada perbedaan ketika hanya mencetaknya!
sumber
range (): range (1, 10) mengembalikan daftar dari 1 hingga 10 angka & menahan seluruh daftar dalam memori.
xrange (): Seperti rentang (), tetapi alih-alih mengembalikan daftar, kembalikan objek yang menghasilkan angka dalam rentang berdasarkan permintaan. Untuk perulangan, ini sedikit lebih cepat daripada range () dan memori lebih efisien. objek xrange () seperti iterator dan menghasilkan angka sesuai permintaan. (Evaluasi Malas)
sumber
Beberapa jawaban lain menyebutkan bahwa Python 3 menghilangkan 2.x's
range
dan mengganti nama 2.x'sxrange
menjadirange
. Namun, kecuali Anda menggunakan 3.0 atau 3.1 (yang seharusnya tidak ada), sebenarnya jenisnya agak berbeda.Seperti yang dikatakan dalam dokumen 3.1 :
Namun, dalam 3.2+,
range
adalah urutan lengkap — ia mendukung irisan yang diperluas, dan semua metodecollections.abc.Sequence
dengan semantik yang sama dengan alist
. *Dan, setidaknya dalam CPython dan PyPy (hanya dua 3.2+ implementasi yang saat ini ada), juga memiliki implementasi konstan-waktu
index
dancount
metode danin
operator (selama Anda hanya lulus bilangan bulat). Ini berarti menulis123456 in r
masuk akal dalam 3,2+, sedangkan dalam 2,7 atau 3,1 itu akan menjadi ide yang mengerikan.* Fakta yang
issubclass(xrange, collections.Sequence)
kembaliTrue
di 2.6-2.7 dan 3.0-3.1 adalah bug yang diperbaiki di 3.2 dan tidak di-backport.sumber
Dalam python 2.x
range (x) mengembalikan daftar, yang dibuat dalam memori dengan x elemen.
xrange (x) mengembalikan objek xrange yang merupakan objek generator yang menghasilkan angka sesuai permintaan. mereka dihitung selama for-loop (Evaluasi Malas).
Untuk perulangan, ini sedikit lebih cepat dari range () dan lebih hemat memori.
sumber
xrange()
bukan generator.xrange(n)
.__ iter __ () `adalah.Saat menguji rentang terhadap xrange dalam satu lingkaran (saya tahu saya harus menggunakan timeit , tapi ini dengan cepat diretas dari memori menggunakan contoh pemahaman daftar sederhana) Saya menemukan yang berikut:
pemberian yang mana:
Atau, menggunakan xrange dalam for loop:
Apakah cuplikan saya pengujian dengan benar? Adakah komentar tentang instance xrange yang lebih lambat? Atau contoh yang lebih baik :-)
sumber
xrange
tampak sedikit lebih cepat, meskipun dengan Python 3 perbandingannya sekarang mubazir.timeit
. Ini mengurus menjalankan berkali-kali, menonaktifkan GC, menggunakan jam terbaik alih-alihtime
, dll.xrange () dan range () dalam python bekerja sama seperti untuk pengguna, tetapi perbedaannya muncul ketika kita berbicara tentang bagaimana memori dialokasikan dalam menggunakan kedua fungsi.
Saat kami menggunakan rentang () kami mengalokasikan memori untuk semua variabel yang dihasilkannya, jadi tidak disarankan untuk digunakan dengan no yang lebih besar. variabel yang akan dihasilkan.
xrange () di sisi lain hanya menghasilkan nilai tertentu pada suatu waktu dan hanya dapat digunakan dengan loop for untuk mencetak semua nilai yang diperlukan.
sumber
range menghasilkan seluruh daftar dan mengembalikannya. xrange tidak - ia menghasilkan angka dalam daftar sesuai permintaan.
sumber
xrange menggunakan iterator (menghasilkan nilai dengan cepat), rentang mengembalikan daftar.
sumber
Apa?
range
mengembalikan daftar statis saat runtime.xrange
mengembalikan sebuahobject
(yang bertindak seperti generator, meskipun jelas bukan salah satu) dari mana nilai-nilai dihasilkan saat dan ketika diperlukan.Kapan menggunakan yang mana?
xrange
jika Anda ingin membuat daftar untuk rentang raksasa, katakan 1 miliar, terutama ketika Anda memiliki "sistem yang peka terhadap memori" seperti ponsel.range
jika Anda ingin mengulangi daftar beberapa kali.PS: Python 3.x ini
range
fungsi == Python 2.x inixrange
fungsi.sumber
xrange
tidak mengembalikan objek generator.Semua orang telah menjelaskannya dengan sangat. Tapi saya ingin melihatnya sendiri. Saya menggunakan python3. Jadi, saya membuka monitor sumber daya (di Windows!), Dan pertama, jalankan perintah berikut terlebih dahulu:
dan kemudian memeriksa perubahan dalam memori 'In Use'. Itu tidak signifikan. Kemudian, saya menjalankan kode berikut:
Dan butuh sebagian besar memori untuk digunakan, secara instan. Dan saya yakin. Anda bisa mencobanya sendiri.
Jika Anda menggunakan Python 2X, ganti 'range ()' dengan 'xrange ()' di kode pertama dan 'list (range ())' dengan 'range ()'.
sumber
Dari dokumen bantuan.
Python 2.7.12
Python 3.5.2
Perbedaannya jelas. Dalam Python 2.x,
range
mengembalikan daftar,xrange
mengembalikan objek xrange yang dapat diubah.Dalam Python 3.x,
range
menjadixrange
dari Python 2.x, danxrange
dihapus.sumber
Pada persyaratan untuk memindai / mencetak item 0-N, range dan xrange berfungsi sebagai berikut.
range () - membuat daftar baru dalam memori dan mengambil seluruh item 0 hingga N (total N +1) dan mencetaknya. xrange () - membuat instance iterator yang memindai item dan hanya menyimpan item yang ada saat ini ke dalam memori, sehingga menggunakan jumlah memori yang sama sepanjang waktu.
Dalam hal elemen yang diperlukan agak di awal daftar hanya kemudian menghemat banyak waktu dan memori.
sumber
xrange
tidak membuat instance iterator. Ia menciptakan sebuahxrange
objek, yang bisa diubah, tetapi bukan iterator — hampir (tetapi tidak cukup) berurutan, seperti daftar.Rentang mengembalikan daftar sementara xrange mengembalikan objek xrange yang mengambil memori yang sama terlepas dari ukuran rentang, seperti dalam kasus ini, hanya satu elemen yang dihasilkan dan tersedia per iterasi sedangkan dalam hal menggunakan rentang, semua elemen dihasilkan sekaligus dan tersedia di memori.
sumber
Perbedaannya berkurang untuk argumen yang lebih kecil ke
range(..)
/xrange(..)
:Dalam hal
xrange(100)
ini hanya sekitar 20% lebih efisien.sumber
range: -range akan mengisi semuanya sekaligus. Yang artinya setiap angka dari rentang akan menempati memori.
xrange: -xrange adalah sesuatu seperti generator, itu akan muncul dalam gambar ketika Anda ingin kisaran angka tetapi Anda tidak ingin mereka disimpan, seperti ketika Anda ingin menggunakannya untuk loop.so memori yang efisien.
sumber
Selain itu, jika dilakukan
list(xrange(...))
akan setara denganrange(...)
.Begitu
list
lambat.Juga
xrange
benar-benar tidak menyelesaikan urutanJadi itu sebabnya ini bukan daftar, itu
xrange
objeksumber
range()
dalam Python2.x
Fungsi ini pada dasarnya adalah fungsi lama
range()
yang tersedia dalam Python2.x
dan mengembalikan sebuah instance darilist
objek yang berisi elemen-elemen dalam rentang yang ditentukan.Namun, implementasi ini terlalu tidak efisien ketika harus menginisialisasi daftar dengan sejumlah angka. Misalnya,
for i in range(1000000)
akan menjadi perintah yang sangat mahal untuk dieksekusi, baik dari segi memori dan penggunaan waktu karena memerlukan penyimpanan daftar ini ke dalam memori.range()
dalam Python3.x
danxrange()
Python2.x
Python
3.x
memperkenalkan implementasi yang lebih baru darirange()
(sementara implementasi yang lebih baru sudah tersedia di Python2.x
melaluixrange()
fungsi).The
range()
memanfaatkan strategi yang dikenal sebagai evaluasi malas. Alih-alih membuat daftar besar elemen dalam jangkauan, implementasi yang lebih baru memperkenalkan kelasrange
, objek ringan yang mewakili elemen yang diperlukan dalam rentang yang diberikan, tanpa menyimpannya secara eksplisit dalam memori (ini mungkin terdengar seperti generator tetapi konsep evaluasi malas adalah berbeda).Sebagai contoh, pertimbangkan hal berikut:
dan
sumber
Lihat posting ini untuk menemukan perbedaan antara rentang dan xrange:
Kutipan:
sumber
xrange
bukan iterator. Daftar dikembalikan olehrange
apakah mendukung iterasi (daftar cukup banyak contoh prototip dari iterable). Manfaat keseluruhanxrange
tidak "minimal". Dan seterusnya.