Có phân bổ động trong Python không?

Python là ngôn ngữ lập trình cấp cao, thông dịch và có mục đích chung. Chắc hẳn bạn đang nghĩ, “Tôi có thực sự cần quản lý bộ nhớ bằng một ngôn ngữ cấp cao như python không? . Hiểu rõ về cách phân bổ, tái sử dụng và hủy phân bổ bộ nhớ cho các đối tượng python cho phép bạn viết mã hiệu quả hơn và giải quyết nhiều vấn đề liên quan đến bộ nhớ bổ sung mà chương trình của bạn sử dụng. ​​​​​​​​

​ ​Quản lý bộ nhớ Python đóng một vai trò quan trọng để làm cho nó trở nên phổ biến và dễ thích nghi. Làm thế nào vậy? . 'Gõ động' là ví dụ tốt nhất để đề cập ở đây. Python cho phép bạn tạo các biến không có thông tin về kiểu và trong tương lai, bạn cũng có thể gán một đối tượng khác bất kể kích thước và kiểu của đối tượng mới

Bạn đã bao giờ tự hỏi làm thế nào điều này có thể xảy ra và làm thế nào python xử lý nó trong nội bộ?

2. Python không có biến, thay vào đó, nó có 'tên'

Nếu bạn đến từ C/C++ hoặc Java, bạn sẽ biết rằng bạn phải khai báo một biến với kiểu của nó trước khi chúng ta có thể sử dụng nó. Dựa trên loại được chỉ định, nó dành một số không gian [kích thước cố định] trong bộ nhớ với giá trị mặc định và sau đó giá trị được lưu trữ trong quá trình gán. Ngoài ra, chúng tôi biết rằng một biến trong C/C++ hoặc java sẽ ghi đè nội dung của nó trong cùng một khối bộ nhớ dành riêng sau khi một giá trị mới được gán cho nó. Nếu chúng ta gán một giá trị lớn hơn, tràn có thể xảy ra

Python hoạt động theo một cách khác và về mặt kỹ thuật, nó không có bất cứ thứ gì như 'biến', thay vào đó, nó sử dụng 'tên'. Xin lưu ý rằng -

· ‘Tên’ trong Python chỉ là nhãn của một đối tượng và dùng để chỉ một giá trị

· Chúng tôi không bao giờ chỉ định thông tin 'loại' trong khi tạo đối tượng

· Một 'tên' trăn có thể thay đổi loại của nó

· Một đối tượng Python có thể có nhiều tên

· Hai tên sẽ trỏ đến cùng một đối tượng nếu phương thức id[x] trả về cùng một giá trị

3. Các giá trị không được cập nhật, thay vào đó, một đối tượng mới được chỉ định

​​​​​​Bạn có thể thấy, cả hai tên 'x' và 'y' đều trỏ đến cùng một đối tượng. Vậy, điều gì xảy ra với 'y' nếu chúng ta thay đổi giá trị của 'x'? . Nếu chúng ta thay đổi giá trị của 'x', trình quản lý bộ nhớ sẽ tìm kiếm xem một đối tượng tương đương với giá trị được cập nhật đã có trong heap chưa?

Python tối ưu hóa việc sử dụng bộ nhớ bằng cách phân bổ cùng một tham chiếu đối tượng cho một biến mới nếu đối tượng đã tồn tại với cùng một giá trị. Đó là lý do tại sao python được gọi là bộ nhớ hiệu quả hơn

​ ​

4. Vậy, 'loại' ở đâu?

Không giống như C/C++ hay Java, các tên python không trỏ đến một 'vị trí bộ nhớ' cụ thể, cũng không cố định trong 'type'. Chúng ta đã thấy, một tên python sẽ bắt đầu tham chiếu đến một đối tượng khác sau khi nó được cập nhật hoặc một giá trị mới được gán. Tương tự, nó kế thừa thông tin 'loại' từ đối tượng mà nó hiện đang đề cập đến. Chúng ta có thể lấy kiểu của tên python bằng cách gọi phương thức type[x]

5. ​​​​​​Bộ nhớ được phân bổ cho các Đối tượng mới như thế nào?

Python sử dụng Phân bổ bộ nhớ động [DMA], được quản lý nội bộ bởi cấu trúc dữ liệu Heap. Tất cả các đối tượng python được lưu trữ trong một đống riêng tư và đống này được quản lý theo cách mà bạn không có quyền kiểm soát đối với nó. Hãy để chúng tôi biết thêm một số chi tiết về DMA và so sánh nó với SMA –

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

Cấp phát bộ nhớ tĩnh

Cấp phát bộ nhớ động

Bộ nhớ được phân bổ tại thời điểm biên dịch. Bộ nhớ được cấp phát khi chương trình bắt đầu thực thi. Đó là cách cấp phát bộ nhớ nhanh hơn. Đó là một cách cấp phát bộ nhớ chậm hơn. Khi bộ nhớ tĩnh được cấp phát, kích thước của nó không thể thay đổi và cũng không thể sử dụng lại. Do đó, kém hiệu quả. Chúng tôi có thể thay đổi kích thước bộ nhớ sau khi cấp phát và cũng có thể được sử dụng lại. Do đó, hiệu quả hơn. Trong trường hợp này, các biến được phân bổ vĩnh viễn và bộ nhớ được phân bổ vẫn bị chặn cho đến khi chương trình kết thúc. Trong trường hợp này, các biến chỉ được cấp phát khi đơn vị chương trình hoạt động và giải phóng bộ nhớ khi các biến nằm ngoài phạm vi. Sử dụng ngăn xếp để quản lý bộ nhớ. Sử dụng heap để quản lý bộ nhớ


6. Một đối tượng Python

​​​​​​​​Python là một ngôn ngữ hướng đối tượng và mọi thứ trong python đều là một đối tượng. Tất cả các đối tượng python luôn bắt nguồn từ 'PyObject', giống như một thùng chứa khóa-giá trị và nó chứa 3 trường bên dưới –

· loại

· đếm lại

· giá trị​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

Python sử dụng trình thông dịch CPython, được viết bằng C. Khi chúng ta tạo một đối tượng python [X=200], bên trong –

· CPython tạo một PyObject trong bộ nhớ

· Loại PyObject được đặt thành số nguyên

· Giá trị của PyObject được đặt thành 200

· Tên 'X' được tạo và đặt thành điểm PyObject

· Số lần giới thiệu PyObject được đặt thành 1. ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

Các đối tượng Python có thể được chia thành 3 phần –

· Các đối tượng đơn giản [Integer, Float, Boolean, String, v.v. ]

· Các đối tượng vùng chứa [Tuple, List, Set, Dictionary, v.v. ]

· Các lớp tùy chỉnh do người dùng định nghĩa [lớp Nhân viên, v.v. ]

7. Làm thế nào các đối tượng được loại bỏ khỏi bộ nhớ. Thu gom rác thải

Chúng tôi đã hiểu, một 'tên' python có thể bắt đầu trỏ đến một đối tượng [mới hoặc hiện có] khác [cùng loại hoặc khác loại], khi chúng tôi cập nhật giá trị của nó hoặc gán một thể hiện mới cho nó. Nhưng điều gì xảy ra với đối tượng cũ hơn, được gọi bằng 'tên' này?

Python là ngôn ngữ được gõ động và tự động phân bổ bộ nhớ cho các đối tượng của nó khi một đoạn chương trình bắt đầu thực thi. Tương tự, Python cũng phân bổ lại bộ nhớ bị chiếm bởi các đối tượng không sử dụng bằng cách sử dụng “Bộ sưu tập rác”. Khi không còn tham chiếu nào nữa, đối tượng có thể được xóa khỏi bộ nhớ một cách an toàn. Python sử dụng 2 thuật toán dưới đây để thực hiện thu gom rác –

· Đếm tham khảo

· Truy tìm

7. 1. Đếm tham khảo

Python tiếp tục theo dõi tất cả các tên [tham chiếu], hiện đang trỏ đến một đối tượng cụ thể. Tổng số tên đề cập đến một đối tượng được gọi là 'số tham chiếu' của đối tượng [PyObject] và Python giữ số này cho trường 'đếm tham chiếu'

Xin lưu ý -

· Số tham chiếu của một đối tượng có thể tăng hoặc giảm linh hoạt

· Chúng ta có thể gọi một sys. getrefco​​​​unt[X] để lấy giá trị đếm lại hiện tại của một đối tượng 'X'

· Truyền x vào hàm getrefcount[] thêm một tham chiếu bổ sung cho nó

Mỗi khi một tham chiếu mới đến một đối tượng Python được tạo, số lượng tham chiếu của nó sẽ tăng lên. Tương tự, mỗi khi một tham chiếu đến một đối tượng Python bị xóa, số lượng tham chiếu của nó sẽ giảm đi. Khi số tham chiếu về 0, chúng ta có thể xóa đối tượng khỏi bộ nhớ một cách an toàn

7. 1. 1 Điều gì tạo nên một tài liệu tham khảo?

Dưới đây là một số trường hợp, khi tham chiếu của đối tượng python [PyObject mới/hiện có] được tạo và số lần tham chiếu được tăng thêm 1 –​​​​​​​​​

· Ràng buộc một đối tượng mới với một cái tên

x = 200

· Sử dụng lại một đối tượng đã có sẵn và đưa ra một tham chiếu mới

y = 200

· Thêm đối tượng vào vùng chứa

z = [200, 200]​​​​

· Truyền nó cho một chức năng

my_fun[200]

7. 1. 2 Điều gì loại bỏ một tham chiếu?

Xem xét các trường hợp bên dưới, khi một tham chiếu đến một đối tượng [PyObject hiện có] bị xóa và bộ đếm tham chiếu bị giảm 1 –

· Gán một đối tượng mới cho một tên

x = Đúng

· Xóa tham chiếu hoặc vùng chứa của nó

​del y

· Khi một biến nằm ngoài phạm vi

Khi một biến cục bộ được tải bằng một khối hoặc phương thức, nó sẽ tự động nhận một số bộ nhớ. Sau khi khối hoàn thành quá trình thực thi, biến được gọi là 'ngoài phạm vi'

Xin lưu ý, không gian tên Toàn cầu không bao giờ vượt quá phạm vi và vẫn tồn tại cho đến khi chương trình hoàn thành việc thực thi

7. 1. 3 Hiệu ứng xếp tầng

Nếu một đối tượng bị xóa O1 đang trỏ đến một đối tượng O2 khác, thì số tham chiếu của O2 cũng sẽ giảm đi 1 và nếu số tham chiếu của O2 bằng 0, thì O2 cũng có thể bị xóa khỏi bộ nhớ. Điều đó có nghĩa là, một số tham chiếu đạt đến 0 có thể khiến nhiều đối tượng bị xóa khỏi bộ nhớ. Đây được gọi là hiệu ứng xếp tầng trong bộ sưu tập rác Python

7. 1. 4 Phép đếm tham chiếu có mặt tốt, mặt xấu và mặt xấu

Tốt. Phần tốt của thuật toán đếm tham chiếu là –

· Dễ thực hiện

· Nó ngay lập tức xóa bộ nhớ khi số lần đếm về 0

Xấu. Đếm tham chiếu có thể được gọi là xấu vì nó là –

· Thuật toán này có liên quan đến một số chi phí không gian, vì nó cần thêm một số không gian cho mỗi đối tượng để lưu trữ các giá trị đếm

· Nó cũng có chi phí thực thi, vì số lượng tham chiếu được thay đổi ở mỗi lần gán. Do đó, một toán tử gán có thể gây ra quá nhiều lần thực thi bên trong. ​​​​​​​​

Xấu xí. Việc đếm tham chiếu đôi khi cho thấy các vấn đề nghiêm trọng như –

· Nó thường không an toàn cho luồng và có thể tạo ra nhiều sự cố khi nhiều luồng đang cố cập nhật số lượng tham chiếu cùng một lúc

· Đếm tham chiếu không phát hiện tham chiếu theo chu kỳ

​​​​​​​​​Trong sơ đồ đã cho [hình 1. 10], có 3 tham chiếu 'x', 'y' và 'z' đang tạo tham chiếu theo chu kỳ và tham chiếu khác 'A' đang trỏ đến 'y'. Khi 'A' bắt đầu đề cập đến một đối tượng mới, 'x', 'y' và 'z' không còn cần thiết trong bộ nhớ. Tuy nhiên, vì số lượng tham chiếu của 3 biến này khác 0 nên trình thu gom rác sẽ không xóa chúng khỏi bộ nhớ. Do đó tính tham chiếu không có khả năng xử lý trường hợp này

7. 2. truy tìm

Bắt đầu từ Python 3, Python sử dụng 'Truy tìm', cùng với việc đếm tham chiếu để xử lý loại tình huống này. Truy tìm hoạt động theo nguyên tắc 'Đánh dấu và quét', được thực hiện theo hai giai đoạn – ​​​​​​​​​

7. 2. 1 giai đoạn đánh dấu

Khi không có đối tượng nào trong bộ nhớ đạt đến giá trị ngưỡng tối đa, nó bắt đầu đánh dấu tất cả các tham chiếu có thể truy cập bằng biểu đồ tham chiếu, e. g. , các nút r, 1, 4, 6, 7 và 8 sẽ được che có thể truy cập được trong giai đoạn đánh dấu

7. 2. 2 giai đoạn quét

Khi tất cả các tham chiếu có thể truy cập được xác định, tất cả các đối tượng còn lại sẽ bị xóa khỏi bộ nhớ trong giai đoạn quét, e. g. , các nút 2, 3 và 5 sẽ bị xóa trong giai đoạn quét

8. Phần kết luận

Trong bài viết này, chúng ta đã hiểu cách python quản lý nội bộ đối tượng của nó để giảm thiểu việc sử dụng bộ nhớ. Chúng ta cũng đã thấy cách python chạy bộ thu gom rác của nó. Hầu hết việc thu gom rác chỉ được thực hiện bằng cách đếm tham chiếu và lập trình viên không có quyền kiểm soát đối với nó. Mặc dù quá nhiều chi phí thực thi trong quá trình quản lý bộ nhớ khiến nó chậm hơn các ngôn ngữ khác, nhưng ngôn ngữ này vẫn được sử dụng rộng rãi nhất vì nó cung cấp nhiều tính năng hữu ích khác cho các lập trình viên

9. Người giới thiệu

· https. // tài liệu. con trăn. org/3/c-api/cấu trúc. html

· https. //trăn thật. com/python-quản lý bộ nhớ

· https. // do thám. com/blog/python-memory-quản lý​​​​​​​​​

· https. //www. youtube. com/watch?v=F6u5rhUQ6dU

· https. //www. youtube. com/watch?v=54NWAYhfbc

· https. // vi. wikipedia. org/wiki/Python_[ngôn ngữ_lập trình]

https. //www. chuyên viên máy tính. org/quản lý bộ nhớ trong python

Phương tiện hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định của Tác giả.  

Có thể phân bổ động trong Python không?

Cấp phát bộ nhớ động hầu như không phải là vấn đề trong Python . Mọi thứ đều là một đối tượng và hệ thống đếm tham chiếu và trình thu gom rác sẽ tự động trả lại bộ nhớ cho hệ thống khi nó không còn được sử dụng nữa.

Python có cấp phát bộ nhớ tĩnh không?

Kết luận. Một tiến trình đang thực thi có hai loại bộ nhớ bộ nhớ ngăn xếp tĩnh và bộ nhớ heap động . Trình thu gom rác trong python sử dụng hai phương thức để đếm tham chiếu thu gom rác và phương thức tạo.

Có malloc trong Python không?

Python có bộ cấp phát pymalloc được tối ưu hóa cho các đối tượng nhỏ [nhỏ hơn hoặc bằng 512 byte] với thời gian tồn tại ngắn. Nó sử dụng ánh xạ bộ nhớ được gọi là "đấu trường" với kích thước cố định là 256 KiB.

Python có phân bổ trên heap không?

Khi một biến được tạo trong Python, nó sẽ được lưu trữ trong một vùng riêng tư, sau đó sẽ cho phép phân bổ và hủy phân bổ . Bộ nhớ heap cho phép các biến này được truy cập trên toàn cầu bằng tất cả các phương thức của chương trình của bạn.

Chủ Đề