Як управляються змінними та пам'яттю в Python? Чи має він стек і купу і який алгоритм використовується для управління пам'яттю? З огляду на ці знання, чи існують рекомендації щодо управління пам’яттю для великого числа / даних?
Як управляються змінними та пам'яттю в Python? Чи має він стек і купу і який алгоритм використовується для управління пам'яттю? З огляду на ці знання, чи існують рекомендації щодо управління пам’яттю для великого числа / даних?
Відповіді:
Як управляються змінними та пам'яттю в Python.
Автоматично! Ні, насправді, ви просто створюєте об'єкт, і віртуальна машина Python обробляє потрібну пам'ять і те, де вона повинна бути розміщена в макеті пам'яті.
Чи має він стек і купу і який алгоритм використовується для управління пам'яттю?
Коли ми говоримо про CPython
це, він використовує приватну купу для зберігання об'єктів. З документації API API CPython C :
Управління пам'яттю в Python включає приватну купу, що містить усі об’єкти та структури даних Python. Управління цією приватною купою забезпечується внутрішньо менеджером пам'яті Python. Менеджер пам’яті Python має різні компоненти, які стосуються різних аспектів управління динамічним сховищем, таких як спільний доступ, сегментація, попереднє розподіл або кешування.
Відновлення пам’яті здійснюється переважно шляхом підрахунку посилань . Тобто, віртуальна машина Python веде внутрішній журнал, скільки посилань посилається на об’єкт, і сміття автоматично збирає його, коли більше немає посилань на нього. Крім того, існує механізм розбиття кругових посилань (з якими підрахунок посилань не може впоратися) шляхом виявлення недосяжних "островів" об'єктів, дещо навпаки традиційним алгоритмам GC, які намагаються знайти всі доступні об'єкти.
ПРИМІТКА: Будь ласка, майте на увазі, що ця інформація єCPython
конкретною. Інші реалізації пітона, такі якpypy
,iron python
,jython
і інші можуть відрізнятися один від одного і від CPythonколи мова заходить про їх специфіці реалізації. Щоб зрозуміти це краще, може допомогти зрозуміти, що існує різниця між семантикою Python (мовою) та базовою реалізацією
З огляду на ці знання, чи існують рекомендації щодо управління пам’яттю для великого числа / даних?
Зараз я не можу говорити про це, але я впевнений, що NumPy (найпопулярніша бібліотека python для дроблення чисел) має механізми, які витончено обробляють споживання пам'яті.
Якщо ви хочете дізнатись більше про внутрішні програми Python, погляньте на ці ресурси:
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 : Джерело