ฉันเข้าใจว่าrange()
ฟังก์ชั่นซึ่งจริงๆแล้วเป็นประเภทวัตถุใน Python 3สร้างเนื้อหาในทันทีคล้ายกับเครื่องกำเนิด
นี่เป็นกรณีที่ฉันคาดว่าบรรทัดต่อไปนี้จะใช้เวลามากเกินไปเพราะในการพิจารณาว่า 1 quadrillion อยู่ในช่วงหรือไม่ต้องสร้างค่า quadrillion:
1000000000000000 in range(1000000000000001)
ยิ่งกว่านั้น: ดูเหมือนว่าไม่ว่าฉันจะเพิ่มศูนย์เป็นจำนวนเท่าใดการคำนวณมากหรือน้อยก็ใช้เวลาเท่ากัน
ฉันได้ลองสิ่งนี้เช่นกัน แต่การคำนวณก็ยังเกือบจะทันที:
1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens
ถ้าฉันพยายามที่จะใช้ฟังก์ชั่นพิสัยของตัวเองผลที่ออกมาไม่ค่อยดีเท่าไหร่ !!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
อะไรคือสิ่งที่range()
วัตถุที่ทำภายใต้ประทุนที่ทำให้มันอย่างรวดเร็ว?
คำตอบ Martijn Pieters'ได้รับเลือกเพื่อความสมบูรณ์ของมัน แต่ยังเห็นคำตอบแรก abarnert ของสำหรับการสนทนาที่ดีของสิ่งที่มันหมายถึงการrange
ที่จะเป็นที่เต็มเปี่ยมลำดับในหลาม 3 และข้อมูลบางส่วน / คำเตือนเกี่ยวกับความไม่ลงรอยกันศักยภาพในการ__contains__
เพิ่มประสิทธิภาพการทำงานข้ามการใช้งานหลาม . คำตอบอื่น ๆ ของ abarnertมีรายละเอียดเพิ่มเติมและให้ลิงก์สำหรับผู้ที่สนใจในประวัติศาสตร์เบื้องหลังการปรับให้เหมาะสมใน Python 3 (และการขาดการเพิ่มประสิทธิภาพของxrange
ใน Python 2) รู้รอบโดยการกระตุ้นและโดย wimจัดเตรียมซอร์สโค้ด C และคำอธิบายที่เกี่ยวข้องสำหรับผู้ที่สนใจ
range
เป็นเครื่องกำเนิดไฟฟ้า
xrange
เหมือนกับ Python3range
ใช่ไหม
xrange()
objects ไม่มี__contains__
วิธีการดังนั้นการตรวจสอบรายการจะต้องวนซ้ำทุกรายการ นอกจากนี้ยังมีการเปลี่ยนแปลงอื่น ๆ เล็กน้อยrange()
เช่นสนับสนุนการแบ่งส่วน (ซึ่งส่งคืนrange
วัตถุอีกครั้ง) และตอนนี้ยังมีcount
และindex
วิธีการเพื่อให้เข้ากันได้กับcollections.Sequence
ABC
bool
หรือlong
ประเภทกับวัตถุชนิดอื่น ๆ มันจะบ้าไปแล้ว ลองด้วย:100000000000000.0 in range(1000000000000001)