รายชื่อ Python สามารถรับได้มากแค่ไหน?


120

ใน Python รายการจะใหญ่แค่ไหน? ฉันต้องการรายชื่อองค์ประกอบประมาณ 12000 รายการ ฉันจะยังเรียกใช้เมธอดรายการเช่นการเรียงลำดับ ฯลฯ ได้หรือไม่

คำตอบ:


193

อ้างอิงถึงรหัสที่มา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องค์ประกอบ

ตราบเท่าที่จำนวนองค์ประกอบที่คุณมีเท่ากันหรือต่ำกว่านี้ฟังก์ชันรายการทั้งหมดควรทำงานได้อย่างถูกต้อง


4
ทำไมsizeof(PyObject*) == 4?? สิ่งนี้แสดงถึงอะไร?
Matt

4
@ Matt PyObject *เป็นจำนวนไบต์ของเดียว สิ่งนั้นคือตัวชี้ที่เรียกว่า (คุณจำได้เพราะมีเครื่องหมายดอกจันอยู่ท้าย) พอยน์เตอร์มีความยาว 4 ไบต์และเก็บแอดเดรสหน่วยความจำไปยังอ็อบเจ็กต์ที่จัดสรร มีความยาว "เท่านั้น" 4 ไบต์เนื่องจากมี 4 ไบต์คุณสามารถจัดการกับทุกองค์ประกอบในหน่วยความจำของคอมพิวเตอร์ในปัจจุบัน
Antonio Ragagnin

1
เป็นที่น่าสังเกต (ดังที่คำตอบของÁlvaro Justen ระบุ) ว่าในเครื่องอื่น ๆ โดยเฉพาะอย่างยิ่งผู้ที่ใช้ระบบ 64 บิตมูลค่าของPY_SSIZE_T_MAXสามารถอย่างมาก
ClydeTheGhost

@ClydeTheGhost คุณสามารถระบุได้หรือไม่ว่าสิ่งเหล่านั้นที่ใช้ระบบ 64 บิตสามารถมีขนาดสูงสุดที่ต่ำกว่าองค์ประกอบ 536,870,912 ได้หรือไม่ หรือว่ามันอาจแตกต่างกันไปมาก แต่ก็มีขนาดสูงสุดที่เท่ากับหรือมากกว่า 536,870,912 องค์ประกอบเสมอ?
ที่

1
@at ค่าสูงสุดสำหรับระบบ 64 บิตจะเท่ากับหรือมากกว่าสำหรับระบบ 32 บิตเสมอ
ClydeTheGhost

73

ตามที่เอกสาร Python กล่าวว่า :

sys.maxsize

จำนวนเต็มบวกที่ใหญ่ที่สุดที่รองรับโดยประเภท Py_ssize_t ของแพลตฟอร์มดังนั้นรายการขนาดสูงสุดสตริงคำสั่งและคอนเทนเนอร์อื่น ๆ สามารถมีได้

ในคอมพิวเตอร์ของฉัน (Linux x86_64):

>>> import sys
>>> print sys.maxsize
9223372036854775807

คำถามนี้ตอบคำถามอย่างไร
ldgorman

11
@ldgorman sys.maxsizeคือคำตอบสำหรับคำถาม สถาปัตยกรรมที่แตกต่างกันรองรับ maxima ที่แตกต่างกัน
Simon Kuang

2
9223372036854775807 องค์ประกอบ? จริงๆ? สิ่งนี้แตกต่างกันอย่างมากจากคำตอบที่ได้รับการโหวตมากที่สุดเช่นกัน
akki

13
@akki คำตอบที่ยอมรับนั้นหมายถึงระบบ 32 บิต เนื่องจากเป็นปี 2559 ฉันจะถือว่าคุณใช้ระบบ 64 บิตและคำตอบจึงถูกต้อง
Brian Leach

2
คำตอบนี้ควรเลือก
Lokesh

26

แน่ใจว่าตกลง จริงๆแล้วคุณสามารถมองเห็นด้วยตัวคุณเองได้อย่างง่ายดาย:

l = range(12000)
l = sorted(l, reverse=True)

การรันเส้นเหล่านั้นบนเครื่องของฉันใช้เวลา:

real    0m0.036s
user    0m0.024s
sys  0m0.004s

แต่แน่ใจเหมือนที่คนอื่นพูด ยิ่งอาร์เรย์มีขนาดใหญ่การดำเนินการก็จะช้าลง


20
การกำหนดเวลาด้วยวิธีนี้อาจทำให้เข้าใจผิดได้ - เวลาส่วนใหญ่ใช้ไปกับการเริ่มต้นล่าม Python วิธีที่ดีกว่าคือ python -m timeit.py "l = range (12000); l = sorted (l, reverse = True)" ในเครื่องของฉันจะให้เวลาประมาณ 1/20 ของเวลาสำหรับตัวอย่างนี้
dF

5
@dF คุณพูดถูกเกี่ยวกับความถูกต้อง ขอบคุณที่แจ้งให้ทราบ ฉันแค่อยากจะพิสูจน์ประเด็น และตัวอย่างก็พิสูจน์ได้
Nadia Alramli

13
@dF: สุดยอด! 0.024 วินาทีนั้นนานเกินไปสำหรับฉันและฉันดีใจที่ฉันสามารถเลิกกังวลเรื่องนั้นได้แล้ว
Thomas Edleson

6

ในรหัสทั่วไปฉันได้สร้างรายการที่มีองค์ประกอบนับล้าน ฉันเชื่อว่าการใช้งานรายการของ Python จะถูกผูกไว้กับจำนวนหน่วยความจำในระบบของคุณเท่านั้น

นอกจากนี้วิธีการ / ฟังก์ชั่นรายการควรทำงานต่อไปแม้จะมีขนาดของรายการก็ตาม

หากคุณสนใจเกี่ยวกับประสิทธิภาพการทำงานก็อาจจะคุ้มค่าที่จะมองเข้าไปในห้องสมุดเช่นNumPy


5

ลักษณะการทำงานของรายการอธิบายไว้ใน Effbot

รายการ Python ถูกนำมาใช้เป็นเวกเตอร์สำหรับการเข้าถึงแบบสุ่มอย่างรวดเร็วดังนั้นโดยทั่วไปคอนเทนเนอร์จะเก็บไอเท็มไว้ได้มากที่สุดเท่าที่มีพื้นที่สำหรับหน่วยความจำ (คุณต้องการพื้นที่สำหรับพอยน์เตอร์ที่มีอยู่ในรายการและพื้นที่ในหน่วยความจำสำหรับวัตถุที่ถูกชี้ไป)

การต่อท้ายคือO(1)(ความซับซ้อนคงที่ที่ตัดจำหน่าย) อย่างไรก็ตามการแทรก / ลบจากตรงกลางของลำดับจะต้องมีการO(n)เรียงลำดับใหม่ (ความซับซ้อนเชิงเส้น) ซึ่งจะช้าลงตามจำนวนองค์ประกอบในรายการของคุณ

คำถามการเรียงลำดับของคุณมีความเหมาะสมมากกว่าเนื่องจากการดำเนินการเปรียบเทียบอาจใช้เวลาไม่ จำกัด หากคุณกำลังดำเนินการเปรียบเทียบช้าจริงๆมันจะใช้เวลานานแม้ว่ามันจะไม่ใช่ความผิดของรายการชนิดข้อมูลของงูใหญ่

การกลับรายการใช้เวลาในการสลับตัวชี้ทั้งหมดในรายการ (จำเป็นต้องเป็นO(n)(ความซับซ้อนเชิงเส้น) เนื่องจากคุณแตะตัวชี้แต่ละตัวหนึ่งครั้ง)


4

12000 องค์ประกอบไม่มีอะไรใน Python ... และจริงๆแล้วจำนวนองค์ประกอบสามารถไปได้ไกลที่สุดเท่าที่ตัวแปล Python มีหน่วยความจำในระบบของคุณ


3

แตกต่างกันไปตามระบบต่างๆ (ขึ้นอยู่กับ RAM) วิธีที่ง่ายที่สุดในการค้นหาคือ

import six six.MAXSIZE 9223372036854775807 ซึ่งจะให้ขนาดสูงสุดlistและdictมากเกินไปตามเอกสารประกอบ


1
นั่นไม่ใช่เอกสาร
บอริส

1

ฉันว่าคุณถูก จำกัด ด้วยจำนวน RAM ทั้งหมดที่มี เห็นได้ชัดว่ายิ่งอาร์เรย์มีขนาดใหญ่ก็จะต้องใช้การดำเนินการที่ยาวนานขึ้น


4
โดยทั่วไปแล้วจะเป็นจริง แต่ไม่ใช่ทั้งหมด - การต่อท้ายจะยังคงตัดจำหน่ายเวลาคงที่โดยไม่ขึ้นกับขนาดของอาร์เรย์
cdleary

0

ฉันได้รับสิ่งนี้จากที่นี่ในระบบ x64 บิต: Python 3.7.0b5 (v3.7.0b5: abb8802389, 31 พฤษภาคม 2018, 01:54:01 น.) [MSC v.1913 64 บิต (AMD64)] บน win32

ใส่คำอธิบายภาพที่นี่


1
นี่จะเป็นคำตอบที่ดีหากคุณขยายรายละเอียดเล็กน้อยและวิธีที่คนอื่นจะหาขีด จำกัด ของตัวเองได้
Shayaan

-16

ไม่มีการ จำกัด จำนวนรายการ สาเหตุหลักที่ทำให้เกิดข้อผิดพลาดคือ RAM โปรดอัปเกรดขนาดหน่วยความจำของคุณ


9
-1 เนื่องจากไม่ได้ตอบคำถามจริงและทำให้เข้าใจผิดจริง ๆ เนื่องจากรายการ (ตามที่แสดงโดยคำตอบอื่น ๆ ) มีขนาดสูงสุด
ClydeTheGhost
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.