Anladığım kadarıyla range()
, aslında Python 3'te bir nesne türü olan fonksiyonun, bir jeneratör gibi, içeriğini anında ürettiği anlaşılıyor .
Bu durumda, aşağıdaki satırın aşırı bir zaman almasını beklerdim, çünkü 1 katrilyonun aralıkta olup olmadığını belirlemek için bir katrilyon değerinin üretilmesi gerekecekti:
1000000000000000 in range(1000000000000001)
Dahası: Kaç tane sıfır eklesem de, hesaplama az ya da çok aynı süreyi alıyor (temelde anlık).
Ben de böyle şeyler denedim, ama hesaplama neredeyse anında:
1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens
Kendi menzil fonksiyonumu uygulamaya çalışırsam, sonuç o kadar hoş değil !!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
range()
Kaputun altında bu kadar hızlı yapan nesne ne yapıyor?
Martijn Pieters'ın cevabı tamlığı için seçildi, ancak aynı zamanda Python 3'te tam teşekküllü bir sıra olmanın ne anlama geldiğinin iyi bir tartışması için Parhon'un ilk cevabını ve Python uygulamaları arasında fonksiyon optimizasyonu için potansiyel tutarsızlık hakkında bazı bilgileri / uyarıları da görün . abarnert'ın diğer yanıtı biraz daha ayrıntıya giriyor ve Python 3'teki optimizasyonun arkasındaki tarihle ilgilenenlere (ve Python 2'de optimizasyon eksikliğine ) bağlantı sağlıyor. Poke ve wim tarafından verilen cevaplar , ilgili C kaynak kodunu ve ilgilenenler için açıklamaları sağlar.range
__contains__
xrange
range
bir jeneratör olduğunu kim söyledi ?
xrange
ile aynırange
değil mi?
xrange()
nesnelerinin __contains__
yöntemi yoktur , bu nedenle öğe kontrolü tüm öğeler arasında döngü yapmalıdır . Artı içinde birkaç diğer değişiklikler vardır range()
o dilimleme destekler (yine bir döndüren gibi range
vardır da artık nesne) ve count
ve index
yöntemler ile uyumlu hale getirmek için collections.Sequence
ABC.
bool
veyalong
tür olması durumunda, diğer nesne türleriyle delireceğini unutmayın. Deneyin:100000000000000.0 in range(1000000000000001)