Giter Club home page Giter Club logo

pythonmemorymanagement's Introduction

pythonMemoryManagement

๐Ÿ’๐Ÿปโ€โ™‚๏ธ Managed Language vs Unmanaged Language

  • Managed Language๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ผ๋ถ€๋Ÿฌ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ํ•ด์ œ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์–ธ์–ด๋ฅผ ๋œปํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ JAVA, Python์ด ์žˆ๋‹ค.
  • Unmanaged language๋Š” ๊ทธ ๋ฐ˜๋Œ€๋กœ ๋Œ€ํ‘œ์ ์œผ๋กœ C๊ฐ€ ์žˆ๋‹ค.

๐Ÿ’๐Ÿปโ€โ™‚๏ธ ๊ธ€์„ ์“ฐ๊ฒŒ ๋œ ์ด์œ 

C๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ 4๊ฐœ๋ฅผ ํ–ˆ๋‹ค. ํŠนํžˆ, ๊ทธ์ค‘ malloc lab๊นŒ์ง€ ํ–ˆ์—ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ์— ๋Œ€ํ•ด์„œ ๊น๊นํžˆ ํ•ด์•ผํ•˜๋Š” C๋ฅผ ํ–ˆ๋˜ ์ž…์žฅ์œผ๋กœ python์€ ์–ด๋–ป๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ด€๋ฆฌ๋˜๋Š”์ง€ ๊ถ๊ธˆํ–ˆ๋‹ค.

๐Ÿ’๐Ÿปโ€โ™‚๏ธ ๋ณ€์ˆ˜ํ• ๋‹น๋ถ€ํ„ฐ

a = 1000

1 . 1000์˜ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ๋‹ด๋Š”๋‹ค. 2 . a๋ผ๋Š” ๋ณ€์ˆ˜๋Š” ๊ทธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

์–ด๋–ค ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š”๋ฐ?

In[1] : a = 1000
In[2] : print(hex(id(a)))
Out[1] : 0x7fee093b9c70

0x7fee093b9c70 ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’๐Ÿปโ€โ™‚๏ธ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

id(a)

id(obj)๋Š” ํ•ด๋‹น ๊ฐ์ฒด / ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. C์—์„œ & ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์ž์™€ ๋™์ผํ•˜๋‹ค. ๊ทธ๋Ÿผ ๋น„๊ต ํ•ด๋ด์•ผ์ง€.

๐Ÿ’๐Ÿปโ€โ™‚๏ธ C์™€ python์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’ ๋น„๊ต

C
char chr = 'a';
printf("%x", &chr);
python
hex(id('a')) # hex๋Š” 16์ง„์ˆ˜๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

์œ„ ๋‘๊ฐ€์ง€๋Š” ๋™์ผํ•œ ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

๐Ÿ’๐Ÿปโ€โ™‚๏ธ is, == ์˜ ์ฐจ์ด๋ฅผ ์•„์‹œ๋‚˜์š”?

1๋ฒˆ ์˜ˆ์‹œ 
In[1] : a = [1,2,3]
In[2] : b = [1,2,3]
In[3] : print(a is b)
Out[1] : False
In[4] : print(a == b)
Out[1] : True
2๋ฒˆ ์˜ˆ์‹œ 
In[1] : a = [1,2,3]
In[2] : b = a
In[3] : print(a is b)
Out[1] : True
In[4] : print(a == b)
Out[1] : True

์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ==์€ ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๋น„๊ต์—ฐ์‚ฐ์ž์ธ ๋ฐ˜๋ฉด์— is๋Š” ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๋น„๊ต์—ฐ์‚ฐ์ž์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ == ์—ฐ์‚ฐ์ž๋Š” ํ•ด๋‹น ๊ฐ’์„ ์ฐพ๊ณ  ๊ทธ ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ์—ฐ์‚ฐ๊ณผ์ •์ด ์žˆ๊ณ  is ๋Š” ๋ฐ”๋กœ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•˜๊ธฐ๋•Œ๋ฌธ์— is ๊ฐ€ ==์— ๋น„ํ•ด ์•ฝ๊ฐ„ ๋” ๋น ๋ฅด๋‹ค.

๐Ÿ’๐Ÿปโ€โ™‚๏ธ ํŒŒ์ด์ฌ์˜ ์ž๋ฃŒํ˜• (mutable vs immutable)

mutable

mutableํ˜•์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์ด๋‹ค. ๊ฐ์ฒด ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋ฉ”๋ชจ๋ฆฌ์˜ ์žฌํ• ๋‹น์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์˜ˆ๋กœ set, list, dict ๋“ฑ์ด ์žˆ๋‹ค.

In[1] : mutable1 = ['alpha'] # list
In[2] : print(hex(id(mutable1)))
Out[1] : 0x7f9cee27eb40
In[3] : mutable1.append('bravo')
In[4] : print(hex(id(mutable1)))
Out[2] : 0x7f9cee27eb40 # ์ฃผ์†Œ๊ฐ’์ด ๊ฐ™๋‹ค

immutable

immutableํ˜•์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋กœ ๊ฐ์ฒด๊ฐ’ ๋ณ€๊ฒฝ ์‹œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์žฌํ• ๋‹น์ด ์ผ์–ด๋‚œ๋‹ค. ์˜ˆ๋กœ int, float, string ๋“ฑ ๋Œ€๋ถ€๋ถ„ ์›์‹œ ์ž๋ฃŒํ˜•๋“ค์ด ์†ํ•œ๋‹ค.

In[1] : immutable1 = 1000 # int
In[2] : print(hex(id(immutable1)))
Out[1] : 0x7fc68f2a2c50
In[3] : immutable1 += 1
In[4] : print(hex(id(immutable1)))
Out[1] : 0x7fc68f2a2d10

is๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฃผ์˜ํ•  ์ ์„ ์•Œ์•„๋ณด์ž.

1๋ฒˆ ์˜ˆ์‹œ

In[1] : a = 1000
In[2] : b = a
In[3] : print(a is b)
Out[1] : True
In[4] : b += 1
In[5] : print(a, b, a is b)
Out[2] : 1000 1001 False

a๋Š” b์™€ ๊ฐ™์€ ์ฃผ์†Œ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ immutable ํ˜•์ธ Intํ˜• b์— 1์„ ๋”ํ•จ์œผ๋กœ์„œ ๋ฉ”๋ชจ๋ฆฌ ์žฌํ• ๋‹น์ด ์ผ์–ด๋‚ฌ๊ณ  b์˜ ์ฃผ์†Œ๊ฐ’์ด ๋ฐ”๋€Œ์–ด out[2]์—์„œ๋Š” False๊ฐ€ ๋‚˜์˜ด์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

2๋ฒˆ ์˜ˆ์‹œ

In[1] : a = ['Mon', 'Tue']
In[2] : b = a
In[3] : b.append('Wed')
In[4] : print(a, b, a is b)
Out[1] : ['Mon', 'Tue', 'Wed'] ['Mon', 'Tue', 'Wed'] True

b์—๋งŒ 'Wed' element๋ฅผ ๋”ํ–ˆ๋Š”๋ฐ a์—๋„ ๋”ํ•ด์ ธ์žˆ๋‹ค. mutableํ˜•์ธ list a์™€ b๋Š” ์„œ๋กœ ๊ฐ™์€ ์ฃผ์†Œ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์„œ๋กœ ์ข…์†๋œ ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š”๋‹ค.

2๋ฒˆ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• 1

์ด๋ฏธ ๊ธ€์„ ์˜ฌ๋ฆฐ ์ ์ด ์žˆ์ง€๋งŒ ํ•ด๋‹น ๊ธ€์˜ ์„ค๋ช…์„ ์œ„ํ•ด ํ•œ๋ฒˆ ๋” ์„ค๋ช…ํ•˜๋„๋ก ํ•œ๋‹ค. ์ด์ „ ๊ธ€์—์„œ python clone, copy ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

In[1] : a = ['Mon', 'Tue']
In[2] : b = a[:]
In[3] : b.append('Wed')
In[4] : print(a, b, a is b)
Out[1] : ['Mon', 'Tue'] ['Mon', 'Tue', 'Wed'] False

slice๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค.

2๋ฒˆ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• 2

In[1] : a = ['Mon', 'Tue']
In[2] : b = a.copy()
In[3] : b.append('Wed')
In[4] : print(a, b, a is b)
Out[1] : ['Mon', 'Tue'] ['Mon', 'Tue', 'Wed'] False

copy ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋‘˜์€ ๋งŒ๋ณ‘ํ†ต์น˜์•ฝ์ผ๊นŒ? ์˜ˆ์‹œ 3

In[1] : a = ['Head', ['Sub']]
In[2] : b = a.copy() # or a[:]
In[3] : b[1].append('Sub2')
In[4] : print(a, b)
Out[1] : ['Head', ['Sub', 'Sub2']] ['Head', ['Sub', 'Sub2']]

list์•ˆ์˜ list (nested list)๋Š” ์™„์ „ํžˆ copy๊ฐ€ ๋˜์ง€ ์•Š์•˜์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. slice์™€ copy์˜ ์ž‘๋™์›๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ (์ƒˆ๋กœ์šด ์ฃผ์†Œ์—) element์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ณต์‚ฌํ•ด ๋„ฃ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— nested list์˜ ์ฃผ์†Œ๊ฐ’์€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ข…์†๋œ ๊ด€๊ณ„๊ฐ€ ๋˜์–ด์„œ ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚ฌ๋‹ค. ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“ˆ์ด ์žˆ๋‹ค.

๐Ÿ’๐Ÿปโ€โ™‚๏ธ copy module

copy.copy() method

[:] ๋‚˜ copy()์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด๋‹ค.

์ฃผ๋ชฉํ•ด์•ผํ•  copy.deepcopy() method

ํ•ด๋‹น ๊ฐ์ฒด์™€ ํ•˜์œ„ ๊ฐ์ฒด๋“ค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ƒˆ๋กœ ํ• ๋‹นํ•ด์„œ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.

In[1] : import copy
In[2] : a = ['Head', ['Sub']]
In[3] : b = copy.deepcopy(a)
In[4] : b[1].append('Sub2')
In[5] : print(a, b)
Out[1] : ['Head', ['Sub']] ['Head', ['Sub', 'Sub2']]

์ž˜ ํ•ด๊ฒฐ๋˜์—ˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’๐Ÿปโ€โ™‚๏ธ del

del ํ‚ค์›Œ๋“œ๋กœ ๋ณ€์ˆ˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ฑฐํ•จ์œผ๋กœ์„œ ๋ณ€์ˆ˜์˜ ์„ ์–ธ์„ ์ทจ์†Œํ•˜๊ณ  ํ•„์š”์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ’์„ ์ง€์šธ ์ˆ˜ ์žˆ๋‹ค.

In[1] : a = 1000
In[2] : print(a)
Out[1] : 1000
In[3] : del a
In[4] : print(a)
NameError : name 'a' is not defined

๐Ÿ’๐Ÿปโ€โ™‚๏ธ reference count

ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ณณ์˜ ์ˆ˜์ด๋‹ค. 0์ด ๋  ๊ฒฝ์šฐ ๋‹ค์Œ GC๋•Œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋œ๋‹ค.

๋ ˆํผ๋Ÿฐ์Šค์นด์šดํŠธ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•

import sys
In[1] : a = {'Jewelry', 'Kim'}
In[2] : b = a
In[3] : print(sys.getrefcount(a))
Out[1] : 3 # 3 ์ธ๊ฒƒ์— ์ฃผ์˜

์—ฌ๊ธฐ์„œ 3์ด ๋‚˜์˜จ ์ด์œ ๋Š” 1 . a๋ฅผ ์„ ์–ธํ•  ๋•Œ + 1 2 . b ๋ฅผ a์˜ ์ฐธ์กฐ๋กœ ์“ฐ๋ฉด์„œ +1 3 . sys.getrefcount์—์„œ ์ธ์ž๋กœ ์“ฐ๋ฉด์„œ +1 ์ด๋ ‡๊ฒŒ 3์ด ๋œ ๊ฒƒ์ด๋‹ค.

๐Ÿ’๐Ÿปโ€โ™‚๏ธ Garbage Collection

ํ•„์š”์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ œํ•œ๋‹ค. ์ด๋•Œ reference count๋ฅผ ์ด์šฉํ•œ๋‹ค. ๋˜ํ•œ Generation์„ ๋‚˜๋ˆ ์„œ ๊ด€๋ฆฌํ•œ๋‹ค. (0,1,2 ์„ธ๋Œ€), ์„ธ๋Œ€๋งˆ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐœ์ˆ˜ threshold๊ฐ€ ์กด์žฌํ•œ๋‹ค. 0์ด ๊ฐ€์žฅ youngํ•œ ์„ธ๋Œ€๊ณ  2๋กœ ๊ฐˆ์ˆ˜๋ก oldํ•œ ์„ธ๋Œ€๊ฐ€ ๋˜๋Š”๋ฐ ๊ฐ€์žฅ youngํ•œ ์„ธ๋Œ€๋ถ€ํ„ฐ GC๋ฅผ ํ•œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ผ์ˆ˜๋ก ์“ธ๋ชจ์—†์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ๋•Œ๋ฌธ์ด๋‹ค.(ex. loop๋ฅผ ๋Œ๋•Œ ์„ ์–ธํ•œ ์ธ๋ฑ์Šค ๋ณ€์ˆ˜)

threshold๊ฐ€ 3์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž

๊ฐ ์ œ๋„ค๋ ˆ์ด์…˜๋งˆ๋‹ค 3๊ฐœ์”ฉ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

a = 'alpha'๋ฅผ ์„ ์–ธํ•ด๋ณธ๋‹ค.

malloc ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰๋˜๊ณ  a๊ฐ€ ์•„๋‹Œ 'alpha'๊ฐ€ 0์„ธ๋Œ€์— ๋“ค์–ด๊ฐ„๋‹ค.

์ด์–ด์„œ 'bravo', 'charlie'๋ฅผ ์„ ์–ธํ•œ๋‹ค.

์—ฌ๊ธฐ์— 'delta'๊ฐ€ ์„ ์–ธ๋œ๋‹ค๋ฉด

collect ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰๋˜๊ณ  0 ์ œ๋„ค๋ ˆ์ด์…˜์—์„œ refcount๊ฐ€ 0์ผ ๊ฒฝ์šฐ ์ง€์šฐ๊ณ  ์•„๋‹ ๊ฒฝ์šฐ 1 ์ œ๋„ค๋ ˆ์ด์…˜์œผ๋กœ ์˜ฌ๋ฆฐ๋‹ค.

์ด๋ฒˆ์—” b๋ฅผ ์ง€์›Œ๋ณด๊ณ  'echo', 'foxtrot', 'golf'๋ฅผ ์„ ์–ธํ•ด๋ณด์ž

bravo๋Š” ์•„์ง ์‚ด์•„์žˆ์ง€๋งŒ ์–ผ๋งˆ ๊ฐ€์ง€ ๋ชปํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค์Œ์„ ๋ณด์ž.

collect๊ฐ€ ํ•œ๋ฒˆ ๋” ์‹œํ–‰์ด ๋˜๊ณ  refcount๊ฐ€ 0์ธ bravo๋Š” ์˜์˜ ์‚ญ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  2์„ธ๋Œ€๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋˜์—ˆ๋‹ค.

์˜ˆ์‹œ์—์„œ๋Š” ์‰ฌ์šด ์„ค๋ช…์„ ์œ„ํ•ด threshold๋ฅผ 3์œผ๋กœ ์„ค์ •ํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š”

In[1] : import gc
In[2] : print(gc.get_threshold())
Out[1] : (700, 10, 10) # 0, 1, 2 generaion์˜ threshold๊ฐ€ ํŠœํ”Œํ˜•ํƒœ๋กœ ์ถœ๋ ฅ

output์˜ (700, 10, 10) ์˜ ๋œป์„ ์•Œ์•„๋ณด์ž 1 . 700 ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ˆ˜๊ฐ€ ํ•ด์ œํ•œ ์ˆ˜๋ณด๋‹ค 700์ด ๋” ๋งŽ์„ ๋•Œ == ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ - ํ•ด์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ˆ˜ ์ด๋•Œ gc๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. (์ˆ˜๋™์œผ๋กœ๋„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ.) 2 . ์ฒซ๋ฒˆ์งธ 10 0์ œ๋„ค๋ ˆ์ด์…˜์˜ gc ์‹คํ–‰ํšŸ์ˆ˜๊ฐ€ 10์ด ๋˜๋ฉด 1์ œ๋„ค๋ ˆ์ด์…˜์—์„œ๋„ gc๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 3 . ๋‘๋ฒˆ์งธ 10 1์ œ๋„ค๋ ˆ์ด์…˜์—์„œ gc ์‹คํ–‰ํšŸ์ˆ˜์˜ 10์ด ๋˜๋ฉด 2์ œ๋„ค๋ ˆ์ด์…˜์—์„œ๋„ gc๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ์„ธ๋Œ€์ฐจ์ด๋ฅผ ๋‘์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. threshold๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋‹ค.

threshold ๋ฐ”๊พธ๊ธฐ
In[1] : import gc
In[2] : gc.set_threshold(800, 20, 20)

๐Ÿ’๐Ÿปโ€โ™‚๏ธ weakref module

๋ง๊ทธ๋Œ€๋กœ ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ์ด๋‹ค. refcount๊ฐ€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ํŠน์ • ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์“ฐ์ง€๋งŒ ํ•„์ˆ˜์ ์ด์ง€๋Š” ์•Š์€ ์ด๋ฏธ์ง€ ์บ์‹ฑ๊ฐ™์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.(๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ„์† ์žก์•„๋จน์ง€ ์•Š๋Š”๋‹ค.)

  • weakref.ref(obj, callback = None) ์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด์˜ weakref๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•ด๋‹น weakref๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์„œ ์›๋ณธ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์—†์„ ์‹œ์— ์—๋Ÿฌ๊ฐ€ ์•„๋‹Œ None์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.(gc๋ ๋•Œ)

class weakref ์ฐธ์กฐ ์˜ˆ์‹œ

import weakref
class SomeClass(object):
    def __init__(self, *args):
        super(SomeClass, self).__init__(*args)
        
a = SomeClass()
b = weakref.ref(a)
print(b())
Out : <__main__.SomeClass object at 0x7fae6c2c04c0>
del a
print(b())
Out : None

image caching ์‚ฌ์šฉ์˜ˆ์‹œ

cache = None
def get_image():
    if cache is None:
        image = Image(file('image.png', 'rb').read())
        cache = weakref.ref(image)
    return cache
show(get_image())
...
# other codes
...
show(get_image())

๐Ÿ’๐Ÿปโ€โ™‚๏ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ด€๋ จ ์†Œ์†Œํ•œ ํŒ๋“ค

1 . string concating ๋ฌธ์ž์—ด ๊ฒฐํ•ฉ์„ ํ”ผํ•˜์ž.

๋‚˜์œ ์˜ˆ
s = ''
for x in somelist:
    s += some_function(x)
์ข‹์€ ์˜ˆ
''.join(map(some_fuction, somelist))
๋‚˜์œ ์˜ˆ
s = 'Hello!' + first_name + ' ' + last_name + '!'
์ข‹์€ ์˜ˆ
s = 'Hello! {} {}'.format(first_name, last_name)

์ด์œ ๋Š” + ๋กœ concat์„ ํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์žฌํ• ๋‹น์„ ํ•˜๋‹ˆ ์„ฑ๋Šฅ์ด ์ €ํ•˜๊ฐ€ ๋œ๋‹ค. python์—์„œ ์ œ๊ณตํ•˜๋Š” join, format ๋“ฑ์˜ ํ•จ์ˆ˜๋กœ ๊ทน๋ณตํ•˜์ž.

2 . Iterating over list

iterate ๋„์ค‘ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉํ•˜์ž.

๋‚˜์œ ์˜ˆ
for k, v in somedict.items():
    somedict[k] = v * 2 # ๋”•์…”๋„ˆ๋ฆฌ์˜ value ๊ฐ’์„ ๋‘๋ฐฐ์”ฉํ•ด์ค€๋‹ค.
์ข‹์€ ์˜ˆ
for k, v in somedict.copy().items():
    somedict[k] = v * 2

3 . Use a little scope as possible

๋‚˜์œ ์˜ˆ
f = file('test.pak', 'rb')
data = f.read()
print(data) # data๋ฅผ ์ฝ์€ ๋’ค์—๋„ ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š”๋‹ค.
์ข‹์€ ์˜ˆ
with file('test.pak', 'rb') as f:
    data = f.read()
    print(data) # with scope ์•ˆ์—์„œ๋งŒ ์ ์œ ํ•œ๋‹ค.

์ฐธ์กฐํ•œ ์˜์ƒ ์œ ํŠœ๋ธŒ ์˜์ƒ '๋ฐฐ์ค€ํ˜„: ํŒŒ์ด์ฌ ๋ฉ”๋ชจ๋ฆฌ ์ด๋ชจ์ €๋ชจ - PyCon Korea 2015 '์„ ๋งŽ์ด ์ฐธ์กฐํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋ฐ”๋€ ๋‚ด์šฉ์ด๋‚˜ ํ‹€๋ฆฐ ๋‚ด์šฉ์€ ๋Œ“๊ธ€, ์ด๋ฉ”์ผ๋กœ ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿ’๐Ÿปโ€โ™‚๏ธ ๊ฒฐ๋ก 

ํŽธ๋ฆฌํ•จ๋งŒ ๋ฐ”๋ผ๋ณด๋ฉด 100์ ์งœ๋ฆฌ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํŽธ๋ฆฌํ•จ ์•ˆ์—๋Š” ๋ณด์ด์ง€ ์•Š๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋งŽ์€ ๋™์ž‘๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋™์ž‘๋“ค์„ ์•Œ๊ณ  ์‚ฌ์šฉํ•  ๋•Œ ์ง„์ •์œผ๋กœ ์ž˜ ์‚ฌ์šฉํ•  ์ค„ ์•„๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋” ๊นŠ์€ ๊ณต๋ถ€๋ฅผ ํ•ด๋ด…์‹œ๋‹ค! ๐Ÿ‘

pythonmemorymanagement's People

Contributors

jewerlykim avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.