ฉันเข้าใจว่า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.SequenceABC
boolหรือlongประเภทกับวัตถุชนิดอื่น ๆ มันจะบ้าไปแล้ว ลองด้วย:100000000000000.0 in range(1000000000000001)