Python มี stack / heap หรือไม่และหน่วยความจำมีการจัดการอย่างไร?


92

ตัวแปรและหน่วยความจำจัดการอย่างไรใน Python มีสแต็กและฮีปหรือไม่และอัลกอริทึมใดที่ใช้ในการจัดการหน่วยความจำ? จากความรู้นี้มีคำแนะนำเกี่ยวกับการจัดการหน่วยความจำสำหรับการประมวลผลข้อมูลจำนวนมากหรือไม่?


1
คุณอาจต้องการอ่านสองสิ่งต่อไปนี้: foobarnbaz.com/2012/07/08/understand-python-variables docs.python.org/2/c-api/memory.html
user1690293

1
มีปัญหาเฉพาะบางอย่างเกี่ยวกับการจัดการ Python var / หน่วยความจำที่คุณกำลังมีปัญหาและเอกสาร Python และ / หรือ Googling ไม่ถูกค้นพบเล็กน้อยหรือไม่
Martin James

คำตอบ:


112

ตัวแปรและหน่วยความจำจัดการอย่างไรใน Python

โดยอัตโนมัติ! ไม่จริงคุณแค่สร้างออบเจ็กต์และ Python Virtual Machine จะจัดการหน่วยความจำที่จำเป็นและตำแหน่งที่จะวางไว้ในเลย์เอาต์หน่วยความจำ

มีสแต็กและฮีปหรือไม่และอัลกอริทึมใดที่ใช้ในการจัดการหน่วยความจำ?

เมื่อเรากำลังพูดถึงCPythonมันใช้ฮีปส่วนตัวสำหรับเก็บวัตถุ จากเอกสาร CPython C API :

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

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

หมายเหตุ:โปรดทราบว่าข้อมูลนี้เป็นข้อมูลCPythonเฉพาะ การใช้งานอื่น ๆ หลามเช่นpypy,iron python,jythonและคนอื่น ๆ อาจแตกต่างจากคนอื่นและจาก CPython เมื่อมันมาถึงรายละเอียดการดำเนินงานของพวกเขา เพื่อให้เข้าใจได้ดีขึ้นอาจช่วยให้เข้าใจว่ามีความแตกต่างระหว่าง Python ความหมาย (ภาษา) และการนำไปใช้

จากความรู้นี้มีคำแนะนำเกี่ยวกับการจัดการหน่วยความจำสำหรับการประมวลผลข้อมูลจำนวนมากหรือไม่?

ตอนนี้ฉันไม่สามารถพูดเกี่ยวกับเรื่องนี้ได้ แต่ฉันแน่ใจว่าNumPy (ไลบรารี python ที่ได้รับความนิยมมากที่สุดสำหรับการกระทืบจำนวน) มีกลไกที่จัดการกับการใช้หน่วยความจำอย่างสง่างาม

หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ Internals ของ Python โปรดดูแหล่งข้อมูลเหล่านี้:


5
คุณดีเน้นความแตกต่างของ Python vs CPython;)
phant0m

1
โปรดทราบว่าตัวแปรภายในจะมีตัวแปรจริงที่เก็บไว้ในสแต็กเฟรม
Marcin

1
Python ไม่ใช่ Java มันไม่มีเครื่องเสมือน มันมีล่าม อาจดูเหมือนอวดรู้ที่จะชี้ให้เห็น แต่เป็นสองกระบวนทัศน์ที่แตกต่างกันและความแตกต่างมีผลกระทบที่สำคัญสำหรับวิธีการรวบรวมและเรียกใช้โค้ด stackoverflow.com/questions/441824/…
Apollo2020

49

งูใหญ่ไม่ได้มีการใด ๆสิ่งดังกล่าว

Python เป็นภาษาและไม่ได้ระบุว่าการใช้งานจะต้องบรรลุความหมายที่กำหนดโดยภาษา Python อย่างไร

ทุกการใช้งาน (CPython, PyPy, IronPython, Stackless , Jython ... ) มีอิสระที่จะทำสิ่งต่างๆของตัวเอง!

ในC Python วัตถุทั้งหมดจะอยู่บนฮีป:

การจัดการหน่วยความจำใน Python เกี่ยวข้องกับฮีปส่วนตัวที่มีวัตถุ Python และโครงสร้างข้อมูลทั้งหมด 1

เครื่องเสมือน CPython ใช้สแต็ก:

>>> def g():
    x = 1
    y = 2
    return f(x, y)

>>> import dis
>>> dis.dis(g)
  2           0 LOAD_CONST           1 (1) # Push 1 onto the stack
              3 STORE_FAST           0 (x) # Stores top of stack into local var x

  3           6 LOAD_CONST           2 (2) # Push 2 onto stack
              9 STORE_FAST           1 (y) # Store TOS into local var y

  4          12 LOAD_GLOBAL          0 (f) # Push f onto stack
             15 LOAD_FAST            0 (x) # Push x onto stack
             18 LOAD_FAST            1 (y) # Push y onto stack
             21 CALL_FUNCTION        2     # Execute function with 2 
                                           # f's return value is pushed on stack
             24 RETURN_VALUE               # Return TOS to caller (result of f)

โปรดทราบว่านี่เป็น CPython เฉพาะ สแต็กไม่มีค่าจริงแต่จะเก็บการอ้างอิงไปยังวัตถุเหล่านั้น

1 : ที่มา

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