Why and When-You Should Use Python Generators

2031 views Nov 23, 2024

ကျွန်တော်တို့ python basic ကိုလေ့လာပြီဆို generators ဆိုတာကလဲမသိမဖြစ်ပါပဲ။ဒီနေ့မှာတော့ ဘယ်လိုအခြေအနေမျိုးမှာသုံးရမယ်နဲ့ ဘာကြောင့်သုံးသင့်တယ်ကို ပြောချင်ပါတယ်။

ပထမဆုံး code ကိုအရင်ကြည့်ရအောင်

import os,psutil
import time
 
def get_memory_usage(id):
	ps = psutil.Process(id)
	print("Memory Usage {} MB".format(ps.memory_info().rss/1024/1024))
 
 
def list_test():
	result = list()
	for i in range(1000000):
		result.append(i)
	return result
 
def generator_test():
	for i in range(1000000):
		yield i 
 
 
pid = os.getpid()
print(pid)
get_memory_usage(pid)
 
t1 = time.clock()
result = list_test()
t2 = time.clock()
 
get_memory_usage(pid)
print("Took {} Seconds".format(t2-t1))

ပထမဆုံး psutil ကို ဒီexampleကိုလိုက်runကြည့်မယ်ဆို install လုပ်ထားဖို့လိုပါတယ်။$ pip install psutil ဆိုပြီးတော့ installလုပ်လိုက်ပါ။

def get_memory_usage(id):
	ps = psutil.Process(id)
	print("Memory Usage {} MB".format(ps.memory_info().rss/1024/1024))

အပေါ်ကcode ကတော့ လိုက်ရှိ memory ဘယ်လောက်သုံးထားတယ်ကိုတိုင်းပြဖို့ရေးထားတာပါ။သိထားယုံပါပဲ။ဘာကြောင့် 1024နဲ့စားထားလဲဆို ရလာတဲ့ memory usageသည် byte အနေနဲ့ပေးလို့ megabtye ကိုပြောင်းထားတာပါ။

def list_test():
	result = list()
	for i in range(1000000):
		result.append(i)
	return result

ဒီတစ်ခုကတော့ listအနေနဲ့ စမ်းဖို့တွက် ရေးထားတာပါ။အရမ်းsimple ဖြစ်လွန်းလို့နားမလည်စရာမရှိပါဘူး။result ဆိုတဲ့ listထဲကို အကြိမ်ပေါင်း 100000 ပတ်ပြီးထည့်လိုက်တယ်။ဒါလေးပါပဲ ပြီးတော့returnပြန်လိုက်တယ်။

def generator_test():
	for i in range(1000000):
		yield i 

ဒါကတော့ generator ရေးတဲ့ပုံစံပါ။yield keyword ကိုသုံးပြီး generator objectတစ်ခုတည်ဆောက်ပါတယ်။ဒါလေးမှတ်ထားပါ။

ပြီးတော့ ကျွန်တော်တို့ အခု list နဲ့ generator ဘာကွာလဲဆိုတာကြည့်ရအောင်

pid = os.getpid()
print(pid)
get_memory_usage(pid)
 
t1 = time.clock()
result = list_test()
t2 = time.clock()
 
get_memory_usage(pid)
print("Took {} Seconds".format(t2-t1))

ပထမဆုံး လက်ရှိrunနေတဲ့ process id ကိုယူလိုက်ပါတယ်။ကျွန်တော်တို့ရလာတဲ့ process id ကိုယူပြီး ဒီ process က memory ဘယ်လောက်သုံးနေတယ်ဆိုတာကြည့်လိုက်ပါတယ်။t1,t2 ကတော့ ကျွန်တော်တို့ run တာ ဘယ်လောက် seconds ကြာတယ်ကိုကြည့်ဖို့ပါ။အဲ့တော့ list_test() ကို runလိုက်တဲ့အခါမှာဘယ်လိုထွက်လာလဲဆိုတာကြည့်ရအောင်

$ python generators.py 
8962
Memory Usage 11.953125 MB
Memory Usage 50.75390625 MB
Took 0.142127 Seconds

အဲ့တော့ ကျွန်တော်တို့ list_test မှာ memory ကသိသိသာသာ တက်သွားတာတွေ့ရပါတယ်။စကန့်ကလဲ 0.14 လောက်ယူနေပါတယ်။ဘာလို့ဆိုတော့  မှတ်ထားရမှာက list သည် memory ပေါ်နေရာယူတယ်ဆိုတာပါပဲ။

အဲ့တော့ result = နေရာမှာ အောက်ကဟာလေးချိန်းပြီး generator_test လုပ်ကြည့်ရအောင်

result = generator_test()
$ python generators.py 
8969
Memory Usage 11.81640625 MB
Memory Usage 11.81640625 MB
Took 3.0000000000030003e-06 Seconds

ကျွန်တော်တို့ generator တွေသည် memoryပေါ်မယူတာတွေ့ရပါတယ်။ပြီးတော့ တော်တေ်ာနည်းတဲ့ အချိန်နဲ့ runတဲ့အပြင် ရေးရတာလဲ yield keywordလေးနဲ့ရေးရတာမို့ ဖတ်ရတာလဲရှင်းသွားပါတယ်။

ဘယ်လိုအခြေနေတွေမှာသုံးသင့်လဲဆိုရင်တော့ မိတ်ဆွေသည် data record ပေါင်းမြောက်များစွာနဲ့အလုပ်လုပ်ရပြီဆို generator တွေသုံးကြည့်ပါ။ဥပမာ computer visionက ကျွန်တော့်pageမှာ တော်တေ်ာမေးပါတယ်။အဲ့တော့ deep learningနဲ့computer visionပေါင်းလာပြီဆို image data record တွေကို ယူတဲ့အခါမှာ generators နဲ့ပြန်ပြီးတော့ ပို့ပေးသင့်ပါတယ်။အားလုံးကျေးဇူးတင်ပါတယ်။

Page ကို review and recommend လုပ်ပေးမယ်ဆိုကျေးဇူးတင်မိမှာပါ။ကျွန်တော်လဲအမြဲမအားတော့ မိတ်ဆွေတို့ဒါမျိုးလုပ်ပေးတာတွေက ထပ်တင်ပေးဖို့ အားဖြစ်စေပါတယ်။