Cách chính xác để giải phóng bộ nhớ trong Python là gì?

Python là ngôn ngữ lập trình hướng đối tượng, nơi chúng ta không phải lo lắng về việc quản lý không gian bộ nhớ trong Python. Nó có "trình quản lý bộ nhớ Python", chịu trách nhiệm cấp phát bộ nhớ và quản lý bộ nhớ, do đó không cần bất kỳ sự can thiệp thủ công nào. Tuy nhiên, đôi khi có những điều kiện cần phải xem trong không gian bộ nhớ

Chúng ta hãy xem đơn vị bộ nhớ cơ bản nhất, hay còn gọi là biến trong Python và xem bộ nhớ hoạt động như thế nào khi xử lý chúng

Biến trong Python là gì?

Biến thường được định nghĩa là tên được gán cho không gian bộ nhớ chứa các giá trị. Bản thân từ 'biến' có nghĩa là các giá trị có thể khác nhau trong cùng một không gian. Chắc hẳn bạn đang thắc mắc liệu ngôn ngữ lập trình có giống nhau không. Bạn sẽ ngạc nhiên khi biết rằng, mọi thứ trong Python đều là đối tượng. Các biến, danh sách, bộ dữ liệu và thậm chí cả các lớp là các thể hiện

Các biến là các tham chiếu đến các đối tượng thực tế chứa giá trị đã cho. Đó là lý do tại sao trong Python chúng ta không phải khai báo các biến hoặc kiểu dữ liệu của chúng trước khi sử dụng chúng.

Ví dụ

# declaring variable without data type
var1 = 5
print(var1)
# type of variable 1
print(type(var1))

# using variable without prior declaration
for i in range(2):
    print(i)

 

Xem cách chúng ta đã khai báo một biến và sử dụng một biến mà không gặp bất kỳ rắc rối nào khi khai báo kiểu dữ liệu hoặc khởi tạo

đầu ra

5
<class 'int'>
0
1

 

Notice how the type(var1) returns . This implies that variable var1 is an instance of class integers.

Nghe có vẻ khó hiểu?

Bộ nhớ được quản lý trong Python như thế nào?

Khi làm việc với Python, có hai loại bộ nhớ

1. Bộ nhớ tĩnh

2. Bộ nhớ động

Python sử dụng cấp phát bộ nhớ động, tôi. e. cấp phát bộ nhớ xảy ra trong thời gian chạy. Cấp phát bộ nhớ động sử dụng cấu trúc dữ liệu Heap để triển khai. Bên cạnh cấu trúc dữ liệu heap, Cấu trúc dữ liệu ngăn xếp được sử dụng để lưu trữ bộ nhớ tĩnh. Đừng nhầm giữa bộ nhớ tĩnh và bộ nhớ động trong Python

Ở đây, bộ nhớ tĩnh đề cập đến ngăn xếp lệnh gọi hàm. Nhớ lại chuỗi cuộc gọi chức năng được lưu trữ bằng cách sử dụng ngăn xếp trong Đệ quy. So với các ngôn ngữ lập trình khác, Python không liên quan đến quản lý bộ nhớ thủ công

Python có trình quản lý Python quản lý dữ liệu ứng dụng trong bộ nhớ, do đó không cần nhiều sự can thiệp của con người khi xử lý không gian bộ nhớ

Điều gì xảy ra khi chúng ta khai báo một biến trong Python?

Biến trong Python không chỉ tham chiếu đến hằng số hoặc giá trị mà còn tham chiếu đến đối tượng. Khi chúng ta khai báo một biến trong Python, nó sẽ tạo một đối tượng trong Không gian Heap riêng lưu trữ giá trị của biến. Trong khi biến được tạo trong bộ nhớ Stack như một tham chiếu đến đối tượng đã nói

Khó hiểu? . Giả sử bạn cần khai báo một biến; . Bây giờ, hãy nhìn vào hình ảnh bên dưới để xem những gì diễn ra đằng sau hậu trường

Cách chính xác để giải phóng bộ nhớ trong Python là gì?

Như bạn thấy, đối tượng lưu trữ giá trị (5) được tạo trong Không gian Heap riêng trong khi biến/tham chiếu đến đối tượng đó được tạo trong bộ nhớ ngăn xếp. Bây giờ, hãy xem xét việc tạo một biến khác, giả sử 'b', có cùng giá trị với 'a'. Bây giờ bạn có thể đoán cách phân bổ bộ nhớ không?

Cách chính xác để giải phóng bộ nhớ trong Python là gì?

Trình quản lý bộ nhớ Python sẽ tạo một tham chiếu khác 'b' cho cùng một đối tượng (lưu trữ 5) được tham chiếu bởi 'a' vì nó có cùng giá trị. Kết quả là sẽ có hai tham chiếu đến cùng một đối tượng. Bất kỳ thay đổi nào đối với một trong các tham chiếu sẽ dẫn đến hỏng liên kết tham chiếu của chúng với đối tượng đó (lưu trữ 5)  và chẳng hạn, tạo ra một đối tượng khác

Bạn có thể coi các biến trong Pythons là các con trỏ (như trong C và C++) tới các đối tượng

Tại sao chúng ta cần Xóa Biến?

Quản lý bộ nhớ là một trong những yếu tố cân nhắc chính khi xử lý phát triển phần mềm bằng Python hoặc bất kỳ ngôn ngữ lập trình nào. Bạn phải tự hỏi tại sao Quản lý bộ nhớ này lại quan trọng như vậy. Bạn thậm chí không nhận thấy nó ảnh hưởng đến mã của bạn như thế nào khi viết bất kỳ chương trình nào

Chà, để tôi nói cho bạn biết, điều này là do bạn chưa xử lý phần mềm lớn hoạt động trên một lượng lớn dữ liệu hoặc dữ liệu lớn. Khi xử lý dữ liệu lớn, bạn sẽ nhận thấy cách quản lý bộ nhớ này ảnh hưởng đến hiệu quả tổng thể và thời gian xử lý của phần mềm

Cấu trúc dữ liệu đã được giới thiệu vì lý do này.  

Thao tác xóa biến hoạt động như thế nào?

Như đã nói trước đó, Python có trình quản lý bộ nhớ Python chịu trách nhiệm cấp phát hoặc hủy cấp phát bộ nhớ heap. Heap bộ nhớ trong Python chứa các đối tượng và các cấu trúc dữ liệu khác được sử dụng trong chương trình

Vì vậy, khi một biến (tham chiếu đến một đối tượng) không còn được sử dụng, trình quản lý bộ nhớ Python sẽ giải phóng không gian, tôi. e. nó loại bỏ các đối tượng không cần thiết. Quá trình loại bỏ các đối tượng không còn được sử dụng này được gọi là Thu gom rác.  

người thu gom rác

Garbage Collector là một quá trình chạy trong nền chương trình Python của bạn. Ngay khi bạn thực thi chương trình Python, trình thu gom rác cũng bắt đầu ở chế độ nền. Do đó, trình thu gom rác không cần phải được kích hoạt hoặc gọi cụ thể. Quá trình này chạy thường xuyên và lấy lại không gian bộ nhớ từ các đối tượng không còn cần thiết cho chương trình.  

Làm cách nào Trình thu gom rác xác định xem có nên xóa một biến (đối tượng) không? . Vì Python có mọi thứ dưới dạng đối tượng, do đó mỗi đối tượng phải có tham chiếu. Như đã thảo luận ở trên, một đối tượng có thể có nhiều hơn một tham chiếu. Ngay khi bạn tạo một biến, đối tượng của biến đó sẽ được tạo trong Không gian Heap Riêng tư.  

Bây giờ, hãy quay lại ví dụ của chúng ta. Vì đối tượng (lưu trữ 5) có hai tham chiếu 'a' và 'b'. Bây giờ giả sử rằng bạn phải xóa biến a. Bạn nghĩ điều gì có thể xảy ra trong bộ nhớ?

Cách chính xác để giải phóng bộ nhớ trong Python là gì?

Vì vậy, đối tượng sẽ không bị xóa vì nó có một tham chiếu (biến 'b') chỉ vào nó. Nhưng tham chiếu (biến 'a') đã bị xóa

Số lượng tham chiếu đến một đối tượng được lưu trữ. Điều này được gọi là Đếm tham chiếu trong Python

Vì vậy, nếu chúng ta nói về ví dụ trên, đối tượng của chúng ta (lưu trữ 5) có 2 tham chiếu, biến 'a' và 'b'. Do đó, Số tham chiếu cho đối tượng của chúng ta (lưu trữ 5) sẽ là 2. Trình thu gom rác sẽ không loại bỏ đối tượng này cho đến khi Số lượng tham chiếu của nó trở về 0. Điều này có nghĩa là cho đến khi cả hai biến ('a' và 'b') bị xóa, đối tượng (lưu trữ 5) sẽ không bị loại bỏ.  

Giống như hình ảnh dưới đây

Cách chính xác để giải phóng bộ nhớ trong Python là gì?

Nhưng cách tiếp cận cổ điển này cũng chùn bước khi xử lý các chu kỳ tham chiếu. Bây giờ, hãy xem cách xóa các biến này trong Python

Làm cách nào để xóa biến trong Python?

Cho đến giờ, chúng ta đã thảo luận về cách thức phân bổ và hủy phân bổ bộ nhớ xảy ra trong Python. Mặc dù Python có Trình thu gom rác và Trình quản lý bộ nhớ để tự động xử lý dung lượng bộ nhớ, nhưng có một số trường hợp bạn cần buộc dọn dẹp bộ nhớ

Chẳng hạn, khi xử lý một lượng lớn dữ liệu hoặc phát triển phần mềm tiêu tốn nhiều dung lượng bộ nhớ. Trong Python, không có nhiều cách để xóa biến. Một số phương pháp nổi tiếng như sau

01) Sử dụng từ khóa del

Sử dụng lệnh 'del' là phương pháp được biết đến nhiều nhất và dễ dàng nhất để xóa các biến trong Python. Từ khóa del xóa các đối tượng. Vì mọi thứ trong Python đều là một đối tượng, do đó, danh sách, bộ dữ liệu và từ điển cũng có thể bị xóa bằng cách sử dụng 'del'. Nó có một cú pháp thực sự đơn giản

cú pháp. tên biến del

Ví dụ: hãy xóa một biến 'a'

# Example -> Deleting a variable in Python using 'del' keyword

# declaring variable
a = 25
print("variable: ", a)
# deleting the variable
del a

# calling out the variable again
print("variable: ", a)

 

Bạn phải tự hỏi làm thế nào bạn biết nếu biến bị xóa. Hãy thử gọi lại biến sau khi xóa nó

đầu ra

variable:  25
Traceback (most recent call last):
  File ".\temp.py", line 10, in <module>
    print("variable: ", a)
NameError: name 'a' is not defined

 

Lưu ý lỗi NameError thu được khi gọi lại biến 'a' sau khi xóa nó. Do đó, điều này chứng tỏ rằng biến 'a' bị xóa bằng từ khóa del

Khi sử dụng từ khóa del để xóa các biến trong Python, bạn phải chắc chắn rằng liệu bạn có thực sự không muốn truy cập biến sau này ở bất kỳ giai đoạn nào trong chương trình của mình hay không. Việc xóa các biến (đối tượng) không cần thiết có thể dẫn đến lỗi. Bạn sẽ không thể truy cập các biến đã xóa này sau khi đã xóa khỏi chương trình

02) Xóa nhiều biến trong Python

Bạn cũng có thể xóa nhiều biến cùng nhau trong Python bằng từ khóa del. Nó tương tự như việc khởi tạo nhiều biến trong một dòng, được phân tách bằng dấu phẩy

cú pháp. del Tên biến1, Tên biến2, Tên biến3

Thí dụ

# Example -> Deleting multiple variables in Python

# declaring multiple variables
a, b, c = 5, 10, 15
print("variables: a: ", a, " b: ", b, " c: ", c)
# deleting multiple variables
del a, b, c

# calling out the variable again
print("variables: a: ", a, " b: ", b, " c: ", c)

 

Xóa nhiều biến tương tự như xóa một biến trong Python

đầu ra

variables: a:  5  b:  10  c:  15
Traceback (most recent call last):
  File ".\temp.py", line 10, in <module>
    print("variables: a: ", a, " b: ", b, " c: ", c)
NameError: name 'a' is not defined

 

Lưu ý cách lỗi NameError chỉ ra biến 'a'. Python là một ngôn ngữ thông dịch, có nghĩa là nó thông dịch các lệnh theo từng dòng. Vì biến 'a' là biến không được khai báo đầu tiên gặp phải, do đó quá trình thực thi tạm dừng ở lỗi đầu tiên. Do đó, lỗi NameError chỉ ra biến 'a'

03) Sử dụng dir() và globals()

Bạn cũng có thể xóa "Tất cả các biến" trong chương trình của mình cùng một lúc. Theo "Tất cả các biến", ý tôi là các biến do người dùng xác định trong phạm vi cục bộ hoặc toàn cầu của chương trình của bạn. Như bạn đã biết, phương thức dir() trả về tất cả các thuộc tính và phương thức của một đối tượng được chỉ định. Ngay cả khi không có đối tượng nào được tham chiếu, nó sẽ trả về danh sách tất cả các biến và phương thức tích hợp được sử dụng trong chương trình của bạn

Ví dụ

# declaring multiple variables
a, b, c = 5, 10, 15
print("variables: a: ", a, " b: ", b, " c: ", c)

#inititalizing d with dir()
d = dir()
#printing the directory
print(d)

 

Bạn sẽ nhận thấy rằng print(d) in ra danh sách tất cả các biến và phương thức trong chương trình đã cho

đầu ra

variables: a:  5  b:  10  c:  15
['__annotations__', '__builtins__', '__cached__', '__doc__', 
'__file__', '__loader__', '__name__', '__package__', '__spec__', 
'a', 'b', 'c']

 

Các biến do người dùng xác định của chúng tôi ('a', 'b' và 'c') nằm ở cuối danh sách. Dấu gạch dưới kép (__) được sử dụng làm hậu tố và tiền tố, phân biệt biến do người dùng xác định với biến hoặc phương thức tích hợp

Đồng thời, phương thức globals() trả về một từ điển có tất cả các biến toàn cục và ký hiệu cho chương trình cùng với các giá trị của chúng. Ví dụ -

________số 8_______

 

Bạn sẽ nhận thấy sự khác biệt giữa phương thức dir() và globals() với đầu ra sau

variables: a:  5  b:  10  c:  15
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000254F32FEB08>, '__spec__': None, 
'__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '.\\temp.py', '__cached__': None, 
'a': 5, 'b': 10, 'c': 15, 'g': {...}}

 

Ở phần cuối của từ điển, hãy lưu ý rằng các biến đã xác định của chúng tôi được in ra cùng với các giá trị của chúng.  

Bây giờ, hãy bắt đầu với việc xóa các biến do người dùng xác định này. Bạn sẽ cần kiểm tra xem tên biến có chứa bất kỳ dấu gạch dưới kép nào ('__') hay không, để phân biệt giữa biến do người dùng xác định và biến tích hợp.  

5
<class 'int'>
0
1
0

 

Lưu ý cú pháp để loại bỏ các biến. Đầu tiên, chúng ta phải xác định xem biến (đối tượng) có phải do người dùng định nghĩa hay không bằng cách tìm kiếm ('__') trong tiền tố. Nếu đối tượng do người dùng định nghĩa, chúng ta phải xóa nó khỏi tệp toàn cục (). Chúng ta có thể chuyển đối tượng tới globals() để xóa vì nó là một từ điển

đầu ra

5
<class 'int'>
0
1
1

 

Và Voila. Các biến do người dùng xác định bị xóa. Tất cả trong một

Phần kết luận

Quản lý bộ nhớ là một yếu tố quan trọng khi nói đến hiệu quả tính toán của một chương trình hoặc phần mềm. Mặc dù Python có Trình quản lý bộ nhớ và Trình thu gom rác riêng, nhưng chúng ta cũng có thể kích hoạt trình thu gom rác hoặc xóa các biến để lấy lại không gian bộ nhớ. Từ khóa 'del' có thể được sử dụng để xóa các đối tượng trong Python. Từ 'đối tượng' bao gồm các biến, danh sách, bộ dữ liệu, bộ, từ điển và hầu hết mọi thứ trong Python. Cố gắng thực hiện các phương pháp trên để xóa các đối tượng khác. Bạn sẽ ngạc nhiên với kết quả mỗi lần

Python có tự động giải phóng bộ nhớ không?

Lập trình viên phải cấp phát bộ nhớ theo cách thủ công trước khi chương trình có thể sử dụng bộ nhớ và giải phóng bộ nhớ khi chương trình không cần đến bộ nhớ đó nữa. Trong Python, quản lý bộ nhớ là tự động. Python tự động xử lý việc cấp phát và hủy cấp phát bộ nhớ .

Chúng ta sẽ quản lý bộ nhớ trong Python như thế nào?

Quản lý bộ nhớ trong Python bao gồm một vùng riêng tư chứa tất cả các đối tượng Python và cấu trúc dữ liệu. Việc quản lý vùng riêng tư này được đảm bảo nội bộ bởi trình quản lý bộ nhớ Python .