การจัดการหน่วยความจำของ Python เรียบง่าย คุณไม่ต้องกังวลเรื่องการจัดการหน่วยความจำ เนื่องจากการจัดสรรและการปล่อยหน่วยความจำเป็นอัตโนมัติ หนึ่งในกลไกของการจัดการหน่วยความจำคือ Garbage Collection มาเข้าใจแง่มุมต่างๆ ของ Garbage Collection กัน
Garbage Collection (การเก็บขยะ)
คือกระบวนการที่หน่วยความจำร่วมของคอมพิวเตอร์ถูกทำความสะอาด ซึ่งกำลังถูกใช้งานโดยโปรแกรมที่ทำงานอยู่ เมื่อโปรแกรมนั้นไม่ต้องการหน่วยความจำส่วนนั้นอีกต่อไป ด้วย Garbage Collection หน่วยความจำที่ว่างเปล่านั้นสามารถนำไปใช้โดยโปรแกรมอื่นได้
มีสองวิธีที่ Python ใช้สำหรับการจัดการหน่วยความจำ −
- Reference Counting (นับอ้างอิง)
- Garbage Collection (การเก็บขยะ)
Garbage Collection ของ Python เป็นอัตโนมัติ แต่ในบางภาษาโปรแกรมมิ่ง คุณต้องทำความสะอาดอ็อบเจกต์เอง ใน Python หากคุณต้องการ คุณสามารถลบอ็อบเจกต์ด้วยตนเองได้
>>> x = 9 >>> print(x) 9 >>> del x >>> print(x) Traceback (most recent call last): File "", line 1, in print(x) NameError: name 'x' is not defined
ข้างต้นเราเพียงแค่กำหนดตัวแปรหนึ่ง (x) และใช้งานมัน ระหว่างรันไทม์ เราลบอ็อบเจกต์ (เพราะทุกอย่างใน Python เป็นอ็อบเจกต์) และพยายามแสดงผลมัน
ในสองบรรทัดแรกของโปรแกรมข้างต้น อ็อบเจกต์ x ถูกจดจำ แต่หลังจากลบอ็อบเจกต์ (x) เราไม่สามารถพิมพ์มันได้อีกแล้ว
ดังนั้นจากข้างต้น เราเห็นว่า Garbage Collection เป็นอัตโนมัติทั้งหมด และเราไม่ต้องกังวลเรื่องนี้ มาเข้าใจแนวคิดข้างต้นด้วยตัวอย่างอีกครั้ง ทุกอ็อบเจกต์ใน Python เช่นในโค้ดข้างต้น อ็อบเจกต์ x มี reference count และ pointer ไปยัง type
Reference count จะเปลี่ยนค่าไปขึ้นอยู่กับว่าเราใช้มันอย่างไร เช่น หากเรากำหนดอ็อบเจกต์ x ให้อ็อบเจกต์ y อีกตัว Reference count จะเพิ่มเป็น 2
>>> some_list = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> # Reference count ของ some_list = 1 >>> other_list = some_list >>> # Reference count = 2 >>> # จะเพิ่มขึ้นอีกหากเราส่งอ็อบเจกต์เป็นอาร์กิวเมนต์ >>> list_total = sum(some_list) >>> # หากเราใส่อ็อบเจกต์ในลิสต์ reference count ก็จะเพิ่มขึ้น >>> list_of_list = [some_list, some_list, some_list] >>> >>> # ลองตรวจสอบ reference count ของอ็อบเจกต์ "some_list" >>> import sys >>> sys.getrefcount(some_list) 6
ข้างต้นเป็นตัวอย่างที่ดีในการเข้าใจ reference counting ของการจัดการหน่วยความจำใน Python เราสร้างอ็อบเจกต์ "some_list" (reference count = 1) กำหนดให้อ็อบเจกต์อื่น (ref. count = 2) ตั้งค่าอ็อบเจกต์เป็นอาร์กิวเมนต์ (ref. count =3) และต่อมาเราใส่อ็อบเจกต์ลงในลิสต์ที่อ็อบเจกต์ปรากฏสามครั้ง (ref. count =6) ต่อมาเมื่อเราลองดู reference count ของอ็อบเจกต์ "some_list" เราได้ 6
>>> import sys >>> sys.getrefcount(some_list) 6 >>> >>> del list_of_list >>> sys.getrefcount(some_list) 3 >>> del some_list >>> sys.getrefcount(some_list) Traceback (most recent call last): File "", line 1, in sys.getrefcount(some_list) NameError: name 'some_list' is not defined