Python có ngăn xếp / đống và bộ nhớ được quản lý như thế nào?


91

Các biến và bộ nhớ được quản lý như thế nào trong Python? Nó có một ngăn xếp và một đống không và thuật toán nào được sử dụng để quản lý bộ nhớ? Với kiến ​​thức này, có bất kỳ khuyến nghị nào về quản lý bộ nhớ cho việc xử lý dữ liệu / số lượng lớn không?


1
Bạn có thể muốn có một đọc những điều sau đây hai: foobarnbaz.com/2012/07/08/understanding-python-variables docs.python.org/2/c-api/memory.html
user1690293

1
Có một số vấn đề cụ thể với quản lý bộ nhớ / var Python mà bạn đang gặp phải và không được tài liệu Python và / hoặc Google Googling phát hiện một cách nhẹ nhàng không?
Martin James

Câu trả lời:


111

Các biến và bộ nhớ được quản lý như thế nào trong Python.

Tự động! Không, thực sự, bạn chỉ cần tạo một đối tượng và Máy ảo Python xử lý bộ nhớ cần thiết và nơi nó sẽ được đặt trong bố cục bộ nhớ.

Nó có một ngăn xếp và một đống không và thuật toán nào được sử dụng để quản lý bộ nhớ?

Khi chúng ta đang nói về CPythonnó, nó sử dụng một heap riêng để lưu trữ các đối tượng. Từ tài liệu API CPython C :

Quản lý bộ nhớ trong Python liên quan đến một heap riêng chứa tất cả các đối tượng và cấu trúc dữ liệu Python. Việc quản lý đống riêng tư này được đảm bảo nội bộ bởi trình quản lý bộ nhớ Python. Trình quản lý bộ nhớ Python có các thành phần khác nhau giải quyết các khía cạnh quản lý lưu trữ động khác nhau, như chia sẻ, phân đoạn, định vị trước hoặc bộ nhớ đệm.

Việc cải tạo bộ nhớ chủ yếu được xử lý bằng cách đếm tham chiếu . Nghĩa là, máy ảo Python giữ một nhật ký nội bộ về số lượng tham chiếu tham chiếu đến một đối tượng và tự động thu thập nó khi không còn tham chiếu nào đề cập đến nó. Ngoài ra, có một cơ chế để phá vỡ các tham chiếu vòng (mà việc đếm tham chiếu không thể xử lý) bằng cách phát hiện các "đảo" không thể truy cập của các đối tượng, phần nào ngược lại với các thuật toán GC truyền thống cố gắng tìm tất cả các đối tượng có thể truy cập.

LƯU Ý: Hãy nhớ rằng thông tin này làCPythoncụ thể. Triển khai khác python, chẳng hạn nhưpypy,iron python,jythonvà những người khác có thể khác nhau và từ CPython khi nói đến chi tiết cụ thể thực hiện. Để hiểu điều đó tốt hơn, có thể giúp bạn hiểu rằng có sự khác biệt giữa ngữ nghĩa (ngôn ngữ) của Python và cách triển khai cơ bản

Với kiến ​​thức này, có bất kỳ khuyến nghị nào về quản lý bộ nhớ cho việc xử lý dữ liệu / số lượng lớn không?

Bây giờ tôi không thể nói về điều này, nhưng tôi chắc chắn rằng NumPy (thư viện python phổ biến nhất để bẻ khóa số) có các cơ chế xử lý việc tiêu thụ bộ nhớ một cách duyên dáng.

Nếu bạn muốn biết thêm về Nội bộ của Python, hãy xem các tài nguyên sau:


5
Tốt cho bạn, bạn nhấn mạnh sự khác biệt giữa Python và CPython;)
phant0m

1
Lưu ý rằng các biến cục bộ sẽ có các biến thực tế được lưu trữ tương đương với một khung ngăn xếp.
Marcin,

1
Python không phải là Java; nó không có máy ảo; nó có một thông dịch viên. Việc chỉ ra điều này có vẻ có vẻ phức tạp nhưng chúng là hai mô hình khác nhau và sự khác biệt có ý nghĩa quan trọng đối với cách mã được biên dịch và chạy. stackoverflow.com/questions/441824/…
Apollo2020,

48

Python không có bất kỳ thứ gì như vậy.

Python là ngôn ngữ và không chỉ định cách triển khai chính xác phải đạt được ngữ nghĩa được ngôn ngữ Python xác định.

Mọi triển khai (CPython, PyPy, IronPython, Stackless , Jython ...) đều miễn phí để thực hiện công việc của riêng mình!

Trong C Python, tất cả các đối tượng sống trên heap:

Quản lý bộ nhớ trong Python liên quan đến một heap riêng chứa tất cả các đối tượng và cấu trúc dữ liệu Python. 1

Máy ảo CPython dựa trên ngăn xếp:

>>> 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)

Hãy nhớ rằng đây là CPython cụ thể. Tuy nhiên, ngăn xếp không chứa các giá trị thực , nó giữ các tham chiếu đến các đối tượng đó.

1 : Nguồn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.