Чи має Python стек / купу і як управляється пам'яттю?


91

Як управляються змінними та пам'яттю в Python? Чи має він стек і купу і який алгоритм використовується для управління пам'яттю? З огляду на ці знання, чи існують рекомендації щодо управління пам’яттю для великого числа / даних?


1
Можливо, ви захочете прочитати наступні два: foobarnbaz.com/2012/07/08/understanding-python-variables docs.python.org/2/c-api/memory.html
user1690293

1
Чи існує якась специфічна проблема з управлінням запам'ятовуванням / пам'яттю Python, з якою ви стикаєтесь, і яку тривіально не виявляє документація Python та / або Google?
Martin James

Відповіді:


111

Як управляються змінними та пам'яттю в Python.

Автоматично! Ні, насправді, ви просто створюєте об'єкт, і віртуальна машина Python обробляє потрібну пам'ять і те, де вона повинна бути розміщена в макеті пам'яті.

Чи має він стек і купу і який алгоритм використовується для управління пам'яттю?

Коли ми говоримо про CPythonце, він використовує приватну купу для зберігання об'єктів. З документації API API CPython C :

Управління пам'яттю в Python включає приватну купу, що містить усі об’єкти та структури даних Python. Управління цією приватною купою забезпечується внутрішньо менеджером пам'яті Python. Менеджер пам’яті Python має різні компоненти, які стосуються різних аспектів управління динамічним сховищем, таких як спільний доступ, сегментація, попереднє розподіл або кешування.

Відновлення пам’яті здійснюється переважно шляхом підрахунку посилань . Тобто, віртуальна машина Python веде внутрішній журнал, скільки посилань посилається на об’єкт, і сміття автоматично збирає його, коли більше немає посилань на нього. Крім того, існує механізм розбиття кругових посилань (з якими підрахунок посилань не може впоратися) шляхом виявлення недосяжних "островів" об'єктів, дещо навпаки традиційним алгоритмам GC, які намагаються знайти всі доступні об'єкти.

ПРИМІТКА: Будь ласка, майте на увазі, що ця інформація єCPythonконкретною. Інші реалізації пітона, такі якpypy,iron python,jythonі інші можуть відрізнятися один від одного і від CPythonколи мова заходить про їх специфіці реалізації. Щоб зрозуміти це краще, може допомогти зрозуміти, що існує різниця між семантикою Python (мовою) та базовою реалізацією

З огляду на ці знання, чи існують рекомендації щодо управління пам’яттю для великого числа / даних?

Зараз я не можу говорити про це, але я впевнений, що NumPy (найпопулярніша бібліотека python для дроблення чисел) має механізми, які витончено обробляють споживання пам'яті.

Якщо ви хочете дізнатись більше про внутрішні програми Python, погляньте на ці ресурси:


5
Добре за вас, ви наголошуєте на різниці між Python та CPython;)
phant0m

1
Зверніть увагу, що локальні змінні матимуть фактичні змінні, що зберігаються в еквіваленті кадру стека.
Марсін

1
Python - це не Java; він не має віртуальної машини; він має перекладача. Звернути увагу на це може здатися педантичним, але це дві різні парадигми, і різниця має важливе значення для способу компіляції та запуску коду. stackoverflow.com/questions/441824 / ...
Apollo2020

48

Python не має якоїсь - або подібне.

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 : Джерело

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.