range Yerine xrange Kullanın

Python'da bir dizi sayı elde etmenin iki yolu vardır: range ve xrange. Pekçok insan açıklayıcı isminden dolayı range'i bilir. Alfabetik sıralamada daha aşağılarda olan xrange ise daha az bilinir.

xrange, aşağıdaki Python 2.3 sürümündeki koda eşdeğer bir üretici nesnedir:

		def xrange(start, stop=None, step=1):
			if stop is None:
				stop = start
				start = 0
			else:
				stop = int(stop)
			start = int(start)
			step = int(step)
		
			while start < stop:
				yield start
        			start += step
	

Tek farkı C ile yazılmış olmasıdır.

xrange'in bazı sınırlamaları vardır. Özellikle sadece tamsayı (int) değerler ile çalışır; uzun tamsası (long) ve noktalı sayılar (float) ile kullanamazsınız (yukarıda gösterildiği gibi tamsayıya dönüştürüleceklerdir).

Üretilen (yielded) nesneyi bir yerlere kaydetmediğiniz sürece belli bir anda sadece tek bir nesne bulunacak ve bu da bellek tasarrufu sağlayacaktır. Fark böylece ortaya çıkmaktadır: range fonksiyonu çağrıldığında çok sayıda sayı (int, long veya foat) içeren nesneler üretir Bu nesnelerin hepsi bir kerede oluşturulur ve aynı anda bellekte bulunur. Sayı miktarının fazla olduğu durumda bu bir zaman kaybı ve performans düşüklüğü olacaktır.

Buna karşın xrange hiç bir sayı üretmez, sadece nesnenin kendisini üretir. Sayı nesneleri ancak, örneğin bir döngü içerisinde, erişmeye çalıştığınızda üretilir.Örneğin:

xrange(sys.maxint) # Döngü yok, .next için bir çağrım yok hiç bir sayı üretilmez

İşte bu yüzden kod anlık olarak çalışabilir. Eğer burada range kullanırsanızi Python kilitlenecektir: sys.maxint sayı nesnelerini (basit bir PC'de yaklaşık 2.1 milyar) bellekte tahsis etmek için çok meşgul olacak ve başka bir iş yapamaz hale gelecektir.

Python 2.2 sürümünden önce xrange nesneleri aynı zamanda hızlı bellek testleri (i in xrange(n)) gibi eniyileştirmeleri de desteklemekteydi. Bu özellik 2.2'de kullanışsız olduğundan dolayı kaldırıldı.