ใน Python รายการจะใหญ่แค่ไหน? ฉันต้องการรายชื่อองค์ประกอบประมาณ 12000 รายการ ฉันจะยังเรียกใช้เมธอดรายการเช่นการเรียงลำดับ ฯลฯ ได้หรือไม่
ใน Python รายการจะใหญ่แค่ไหน? ฉันต้องการรายชื่อองค์ประกอบประมาณ 12000 รายการ ฉันจะยังเรียกใช้เมธอดรายการเช่นการเรียงลำดับ ฯลฯ ได้หรือไม่
คำตอบ:
อ้างอิงถึงรหัสที่มาPY_SSIZE_T_MAX/sizeof(PyObject*)
ขนาดสูงสุดของรายการคือ
PY_SSIZE_T_MAX
ถูกกำหนดในpyport.hให้เป็น((size_t) -1)>>1
ในระบบ 32 บิตปกตินี่คือ (4294967295/2) / 4 หรือ 536870912
ดังนั้นขนาดสูงสุดของรายการ python บนระบบ 32 บิตคือ536,870,912องค์ประกอบ
ตราบเท่าที่จำนวนองค์ประกอบที่คุณมีเท่ากันหรือต่ำกว่านี้ฟังก์ชันรายการทั้งหมดควรทำงานได้อย่างถูกต้อง
PyObject *
เป็นจำนวนไบต์ของเดียว สิ่งนั้นคือตัวชี้ที่เรียกว่า (คุณจำได้เพราะมีเครื่องหมายดอกจันอยู่ท้าย) พอยน์เตอร์มีความยาว 4 ไบต์และเก็บแอดเดรสหน่วยความจำไปยังอ็อบเจ็กต์ที่จัดสรร มีความยาว "เท่านั้น" 4 ไบต์เนื่องจากมี 4 ไบต์คุณสามารถจัดการกับทุกองค์ประกอบในหน่วยความจำของคอมพิวเตอร์ในปัจจุบัน
PY_SSIZE_T_MAX
สามารถอย่างมาก
ตามที่เอกสาร Python กล่าวว่า :
sys.maxsize
จำนวนเต็มบวกที่ใหญ่ที่สุดที่รองรับโดยประเภท Py_ssize_t ของแพลตฟอร์มดังนั้นรายการขนาดสูงสุดสตริงคำสั่งและคอนเทนเนอร์อื่น ๆ สามารถมีได้
ในคอมพิวเตอร์ของฉัน (Linux x86_64):
>>> import sys
>>> print sys.maxsize
9223372036854775807
sys.maxsize
คือคำตอบสำหรับคำถาม สถาปัตยกรรมที่แตกต่างกันรองรับ maxima ที่แตกต่างกัน
แน่ใจว่าตกลง จริงๆแล้วคุณสามารถมองเห็นด้วยตัวคุณเองได้อย่างง่ายดาย:
l = range(12000)
l = sorted(l, reverse=True)
การรันเส้นเหล่านั้นบนเครื่องของฉันใช้เวลา:
real 0m0.036s
user 0m0.024s
sys 0m0.004s
แต่แน่ใจเหมือนที่คนอื่นพูด ยิ่งอาร์เรย์มีขนาดใหญ่การดำเนินการก็จะช้าลง
ลักษณะการทำงานของรายการอธิบายไว้ใน Effbot
รายการ Python ถูกนำมาใช้เป็นเวกเตอร์สำหรับการเข้าถึงแบบสุ่มอย่างรวดเร็วดังนั้นโดยทั่วไปคอนเทนเนอร์จะเก็บไอเท็มไว้ได้มากที่สุดเท่าที่มีพื้นที่สำหรับหน่วยความจำ (คุณต้องการพื้นที่สำหรับพอยน์เตอร์ที่มีอยู่ในรายการและพื้นที่ในหน่วยความจำสำหรับวัตถุที่ถูกชี้ไป)
การต่อท้ายคือO(1)
(ความซับซ้อนคงที่ที่ตัดจำหน่าย) อย่างไรก็ตามการแทรก / ลบจากตรงกลางของลำดับจะต้องมีการO(n)
เรียงลำดับใหม่ (ความซับซ้อนเชิงเส้น) ซึ่งจะช้าลงตามจำนวนองค์ประกอบในรายการของคุณ
คำถามการเรียงลำดับของคุณมีความเหมาะสมมากกว่าเนื่องจากการดำเนินการเปรียบเทียบอาจใช้เวลาไม่ จำกัด หากคุณกำลังดำเนินการเปรียบเทียบช้าจริงๆมันจะใช้เวลานานแม้ว่ามันจะไม่ใช่ความผิดของรายการชนิดข้อมูลของงูใหญ่
การกลับรายการใช้เวลาในการสลับตัวชี้ทั้งหมดในรายการ (จำเป็นต้องเป็นO(n)
(ความซับซ้อนเชิงเส้น) เนื่องจากคุณแตะตัวชี้แต่ละตัวหนึ่งครั้ง)
12000 องค์ประกอบไม่มีอะไรใน Python ... และจริงๆแล้วจำนวนองค์ประกอบสามารถไปได้ไกลที่สุดเท่าที่ตัวแปล Python มีหน่วยความจำในระบบของคุณ
แตกต่างกันไปตามระบบต่างๆ (ขึ้นอยู่กับ RAM) วิธีที่ง่ายที่สุดในการค้นหาคือ
import six
six.MAXSIZE
9223372036854775807
ซึ่งจะให้ขนาดสูงสุดlist
และdict
มากเกินไปตามเอกสารประกอบ
ฉันว่าคุณถูก จำกัด ด้วยจำนวน RAM ทั้งหมดที่มี เห็นได้ชัดว่ายิ่งอาร์เรย์มีขนาดใหญ่ก็จะต้องใช้การดำเนินการที่ยาวนานขึ้น
ฉันได้รับสิ่งนี้จากที่นี่ในระบบ x64 บิต: Python 3.7.0b5 (v3.7.0b5: abb8802389, 31 พฤษภาคม 2018, 01:54:01 น.) [MSC v.1913 64 บิต (AMD64)] บน win32
ไม่มีการ จำกัด จำนวนรายการ สาเหตุหลักที่ทำให้เกิดข้อผิดพลาดคือ RAM โปรดอัปเกรดขนาดหน่วยความจำของคุณ
sizeof(PyObject*) == 4?
? สิ่งนี้แสดงถึงอะไร?