def generator(n):
i = 0
while i < n:
yield i
i += 1
yield
๋ฅผ ๋ง๋๊ฒ ๋ ๊ฒฝ์ฐ, ํด๋น ํจ์๋ ๊ทธ ์ํ๋ก ์ ์ง ๋๋ฉฐ, ๋ฐํ ๊ฐ์ next() ๋ฅผ ํธ์ถํ ์ชฝ์ผ๋ก ์ ๋ฌ ํ๊ฒ ๋๋ค. ์ดํ ํด๋น ํจ์๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ฒ๋ผ ์ข
๋ฃ๋๋ ๊ฒ์ด ์๋๋ผ ๊ทธ ์ํ๋ก ์ ์ง๋๊ฒ ๋๋ค. ์ฆ, ํจ์์์ ์ฌ์ฉ๋ local ๋ณ์๋ instruction pointer ๋ฑ๊ณผ ๊ฐ์ ํจ์ ๋ด๋ถ์์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ๊ทธ๋๋ก ์ ์ง๋๋ค.a = [i for i in range(5)]
print(a) # [0, 1, 2, 3, 4]
b = (i for i in range(5))
print(b) # <generator object <genexpr> at 0x7f1235d1ff90>
โ memory๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
import sys
#list
sys.getsizeof( [i for i in range(100) if i % 2] )
# 520
sys.getsizeof( [i for i in range(500) if i % 2] )
# 2208
#generator
sys.getsizeof( (i for i in range(100) if i % 2) )
# 112
sys.getsizeof( (i for i in range(500) if i % 2) )
# 112
โ Lazy evaluation ์ฆ ๊ณ์ฐ ๊ฒฐ๊ณผ ๊ฐ์ด ํ์ํ ๋๊น์ง ๊ณ์ฐ์ ๋ฆ์ถ๋ ํจ๊ณผ
def sleep_func(x):
print ("sleep")
time.sleep(1)
return x
# list ์์ฑ
list = [sleep_func(x) for x in xrange(5)]
for i in list:
print i
#๊ฒฐ๊ณผ ๊ฐ
sleep
sleep
sleep
sleep
sleep
0
1
2
3
4
# generator ์์ฑ
gen = (sleep_func(x) for x in xrange(5))
for i in gen:
print i
#๊ฒฐ๊ณผ ๊ฐ
sleep
0
sleep
1
sleep
2
sleep
3
sleep
4
list comprehension ์ ์ํ ํ ๋, list์ ๋ชจ๋ ๊ฐ์ ๋จผ์ ์ํํ๊ธฐ ๋๋ฌธ์ sleep_func() ํจ์๋ฅผ xrange() ๊ฐ ๋งํผ ํ๋ฒ์ ์ํํ๊ฒ ๋๋ค. ๋ง์ฝ sleep_func() ์์ ์ํํ๋ ์๊ฐ์ด ๊ธธ๊ฑฐ๋ list ๊ฐ์ด ๋งค์ฐ ํฐ ๊ฒฝ์ฐ ์ฒ์ ์ํ ํ ๋ ๊ทธ๋งํผ ๋ถ๋ด์ผ๋ก ์์ฉ๋๋ค.
generator ์ ๊ฒฝ์ฐ generator๋ฅผ ์์ฑํ ๋๋ ์ค์ ๊ฐ์ ๋ก๋ฉํ์ง ์๊ณ , for ๋ฌธ์ด ์ํ ๋ ๋ ํ๋์ฉ sleep_func()์ ์ํํ๋ฉฐ ๊ฐ์ ๋ถ๋ฌ์ค๊ฒ ๋๋ค. ์ํ ์๊ฐ์ด ๊ธด ์ฐ์ฐ์ ํ์ํ ์๊ฐ๊น์ง ๋ฆ์ถ ์ ์๋ค๋ ์ ์ด ํน์ง์ด๋ค.