ÆÄÀ̽㠼öÇà¼Óµµ °³¼± ÆÁ

ÀÌ ÆäÀÌÁö´Â ÆÄÀ̽ã ÇÁ·Î±×·¥ÀÇ ¼öÇà¼Óµµ¸¦ ÁõÁø½ÃŰ´Â ÆÁ°ú ²Ä¼öµéÀ» À§ÇÏ¿© ¹ÙÄ¡°í ÀÖ½À´Ï´Ù. Á¤º¸°¡ ´Ù¸¥ ¾î¶²À̷κÎÅÍ ¿Ã ¶§¸¶´Ù, ³ª´Â ±× Ãâó¸¦ ¹àÈ÷·Á°í ³ë·ÂÇϰí ÀÖ½À´Ï´Ù.

ÀÌ ÁÖÁ¦¿¡ °üÇÏ¿© ¹àÀº ºûÀ» ºñÃß¾î Áֽ÷Á¸é, ¾Ë·Á ÁÖ¼¼¿ä.

¸ñÂ÷

ÄÚµå À±°ûÀâ±â

¿©·¯ºÐÀÇ ÇÁ·Î±×·¥ ¼Óµµ¸¦ Áõ°¡½ÃŰ´Â ù° ´Ü°è´Â º´¸ñÀÌ ¾îµð¿¡ ÀÖ´ÂÁö ¾Ë¾Æ³»´Â °ÍÀÔ´Ï´Ù. Àý´ë·Î ½ÇÇàµÇÁö ¾Ê°Å³ª ÀÌ¹Ì ºü¸£°Ô ½ÇÇàµÇ´Â Äڵ带 ÃÖÀûÈ­ÇÑ´Ù´Â °ÍÀº ÀüÇô Àǹ̰¡ ¾ø½À´Ï´Ù. ³ª´Â µÎ °³ÀÇ ¸ðµâ, profile°ú trace¸¦ »ç¿ëÇØ¼­ ³ªÀÇ Äڵ忡 ÀÖ´Â ¹®Á¦Á¡À» ã´Âµ¥ µµ¿òÀ» ¹Þ°í ÀÖ½À´Ï´Ù.

Profile ¸ðµâ

profile ¸ðµâÀº ÆÄÀ̽㠹èÆ÷º»ÀÇ Ç¥ÁØ ¸ðµâ·Î Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ±×°ÍÀ» »ç¿ëÇÏ¸é ´ë´ÜÈ÷ ¿ëÀÌÇÏ°Ô ÀÏ´ÜÀÇ ÇÔ¼öÀÇ ½ÇÇàÀ» À±°ûÁö¿ï ¼ö ÀÖ½À´Ï´Ù. ¿©·¯ºÐÀÇ ÁÖÇÔ¼ö°¡ mainÀ̶ó°í ºÒ¸®¿ì¸ç, ¾Æ¹«·± Àμöµµ ÃëÇÏÁö ¾Æ´ÏÇÏ¸ç ±×¸®°í ÇÁ·ÎÆÄÀÏ ¸ðµâÀÇ ÅëÁ¦ÇÏ¿¡¼­ ±×°ÍÀ» ½ÇÇà½Ã۱⸦ ¿øÇÑ´Ù°í °¡Á¤ÇØ º¾½Ã´Ù. °¡Àå °£´ÜÈ÷ ÇüÅ´Â, ´ÜÁö ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇÏ´Â °Ì´Ï´Ù

import profile
profile.run('main()')
main()ÀÌ ¹ÝȯµÉ ¶§, profile ¸ðµâÀº ÇÔ¼ö È£Ãâ°ú ½ÇÇà ½Ã°£À» ´ãÀº Ç¥¸¦ Ãâ·ÂÇÒ °ÍÀÔ´Ï´Ù. Ãâ·ÂÀº ±× ¸ðµâ¿¡ Æ÷ÇÔµÈ Stats Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© Á¶ÀÛÇÒ ¼ö ÀÖ½À´Ï´Ù. ´õ ÀÚ¼¼ÇÑ »çÇ×Àº, profile ¸ðµâÀÇ ¹®¼­¸¦ ÂüÁ¶Çϼ¼¿ä (Lib/profile.doc).

Trace ¸ðµâ

trace ¸ðµâÀº profile ¸ðµâÀÇ ºÎ»ê¹°·Î¼­ ¿ø·¡´Â ¾î¶² ¹Ì¿Ï¼º ¼­¼ú¹® ¼öÁØÀÇ Å×½ºÆ® ¹üÀ§(some crude statement level test coverage)¸¦ ¼öÇàÇϱâ À§ÇÏ¿© ³»°¡ ÀÛ¼ºÇÏ¿´½À´Ï´Ù . ÆÄÀ̽ã 2.0ÇöÀçºÎ·Î ¿©·¯-ºÐÀº ÆÄÀ̽㠹èÆ÷º»ÀÇ Tools/scripts µð·ºÅ丮¿¡ ÀÖ´Â trace.py¸¦ ã¾Æ º¸¾Æ¾ß ÇÕ´Ï´Ù. ¾Øµå·ù ´ÞÅ©(Andrew Dalke)ÀÇ ´öºÐÀ¸·Î ¸í·É¾î ¶óÀÎÀ¸·ÎºÎÅÍ ½ÇÇàÇÏ¿© Àüü ½ºÅ©¸³Æ®ÀÇ ½ÇÇàÀ» ¸Å¿ì ½±°Ô ÃßÀûÇÒ ¼ö ÀÖ½À´Ï´Ù:

% trace.py -t spam.py eggs
º°°³·Î Á¸ÀçÇÏ´Â ¹®¼­´Â ¾øÁö¸¸, ±× ¸ðµâÀÇ ÃÖ»óÀ§¿¡´Â °ÅÀÇ ¿ÏÀüÇÑ ¹®¼­È­¹®ÀÚ¿­ÀÌ ÀÖ½À´Ï´Ù.

Á¤·Ä

±Íµµ ¹Ý ·Î¼¶(Guido van Rossum)À¸·ÎºÎÅÍ Àοë

±âº»ÀûÀÎ ÆÄÀ̽㠰´Ã¼ÀÇ ¸®½ºÆ®¸¦ Á¤·ÄÇÏ´Â °ÍÀº ÀϹÝÀûÀ¸·Î È¿À²ÀûÀÔ´Ï´Ù. ¸®½ºÆ®¿ë sort ¸Þ½îµå´Â ¼±ÅÃÀûÀÎ ºñ±³ ÇÔ¼ö¸¦ Àμö·Î ¹Þ´Âµ¥ ±× Àμö´Â Á¤·Ä ÇàÀ§¸¦ º¯°æÇÏ´Â µ¥ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. À̰ÍÀº ´ë´ÜÈ÷ Æí¸®ÇÕ´Ï´Ù, ±×·¸Áö¸¸, ½ÇÁ¦·Î´Â Á¤·Ä ¼Óµµ¸¦ ¶³¾î ¶ß¸± ¼ö ÀÖ½À´Ï´Ù.

Á¤·Ä ¼Óµµ¸¦ ³ôÀÌ´Â ¶Ç ´Ù¸¥ ´ë¾ÈÀûÀÎ ¹æ½ÄÀº ÅÍÇÃÀ» ´ãÀº ¸®½ºÆ®¸¦ ±¸¼ºÇÏ´Â °ÍÀ¸·Î¼­ ù ¹øÂ° ¿ä¼Ò´Â Á¤·ÄŰÀÌ¸ç ±âº» ºñ±³ÇàÀ§¸¦ »ç¿ëÇÏ¿© ÀûÀýÇÏ°Ô Á¤·ÄÇÒ °ÍÀÔ´Ï´Ù, ±×¸®°í ±×ÀÇ µÎ ¹øÂ° ¿ä¼Ò´Â ¿ø·¡ÀÇ ¸®½ºÆ® ¿ä¼ÒÀÔ´Ï´Ù.

¿¹¸¦ µé¾î, ¿©·¯ºÐÀº ÅÍÇÃÀ» ´ãÀ» ¸®½ºÆ² °¡Áö°í ÀÖ°í °¢ ÅÍÇÃÀÇ n-¹øÂ° Çʵå·Î Á¤·ÄÇϱ⸦ ¿øÇÑ´Ù°í °¡Á¤ÇØ º¾½Ã´Ù. ´ÙÀ½ÀÇ ÇÔ¼ö°¡ ±×·¸°Ô ÇØ ÁÙ °ÍÀÔ´Ï´Ù.

def sortby(list, n):
    nlist = map(lambda x, n=n: (x[n], x), list)
    nlist.sort()
    return map(lambda (key, x): x, nlist)
¿©±â¿¡ »ç¿ë¹ýÀÌ ÀÖ½À´Ï´Ù:
>>> list = [(1, 2, 'def'), (2, -4, 'ghi'), (3, 6, 'abc')]
>>> list.sort()
>>> list 
[(1, 2, 'def'), (2, -4, 'ghi'), (3, 6, 'abc')]
>>> sortby(list, 2)
[(3, 6, 'abc'), (1, 2, 'def'), (2, -4, 'ghi')]
>>> sortby(list, 1) 
[(2, -4, 'ghi'), (1, 2, 'def'), (3, 6, 'abc')]

¹®ÀÚ¿­ °áÇÕ

ÆÄÀ̽㿡¼­ ¹®ÀÚ¿­À» º¯°æºÒ°¡ÀÔ´Ï´Ù. ÀÌ »ç½ÇÀº ¾ÆÁÖ ÀÚÁÖ Ãʺ¸ ÆÄÀ̽ã ÇÁ·Î±×·¡¸ÓÀÇ ¾ûµ¢À̸¦ ¸ô·¡ Ÿ°í ¿Ã¶ó¿Í ¹°¾î¹ö¸³´Ï´Ù. º¯°æºÒ°¡¶ó°í ÇÏ´Â °ÍÀº ¾î¶² ¸é¿¡¼­´Â ÀÌÁ¡ÀÌ ±×¸®°í ¾î¶² ¸é¿¡¼­´Â ´ÜÁ¡ÀÌ ÀÖ½À´Ï´Ù. ÀåÁ¡À̶ó¸é, ¹®ÀÚ¿­Àº »çÀü¿¡¼­ Ű·Î »ç¿ëµÉ ¼ö ÀÖÀ¸¸ç ±×¸®°í °³º°ÀûÀÎ º¹»çº»µéÀº ´ÙÁß º¯¼ö ¿«±â¿¡¼­ °øÀ¯µÉ ¼ö ÀÖ½À´Ï´Ù. (ÆÄÀ̽ãÀº ÀÚµ¿ÀûÀ¸·Î ÇѰ³- ¿Í µÎ°³Â¥¸®-¹®ÀÚ ¹®ÀÚ¿­À» °øÀ¯ÇÕ´Ï´Ù.) ´ÜÁ¡À̶ó¸é, ÁÖ¾îÁø ¹®ÀÚ¿­¿¡¼­ "¸ðµç a¸¦ ¸ðµÎ b·Î ¹Ù²Û´Ù´Â °Í"°ú °°Àº °ÍµéÀ» Àå´ãÇÒ ¼ö ¾ø½À´Ï´Ù. ´ë½Å¿¡, ¿øÇÏ´Â ¹ÙÀÇ ¼Ó¼ºÀ» °¡Áö´Â »õ·Î¿î ¹®ÀÚ¿­À» »ý¼ºÇؾ߸¸ ÇÕ´Ï´Ù. ÀÌ·± °è¼ÓÀûÀÎ º¹»ç´Â ÆÄÀ̽ã ÇÁ·Î±×·¥¿¡¼­ Áß´ëÇÑ ºñÈ¿À²¼ºÀ» ¾ß±âÇÒ ¼ö ÀÖ½À´Ï´Ù.

´ÙÀ½Àº ¾Æ·Ð ¿öÅͽº(Aaron Watters)ÀÇ º¸°í·ÎºÎÅÍ ÀοëÇÕ´Ï´Ù:

À̰ÍÀ» ÇÇÇϼ¼¿ä:

str = ""
   for substring in list:
       str = str + substring

´ë½Å¿¡ "".join(list)À» »ç¿ëÇϼ¼¿ä. ¾ÕÀÇ °ÍÀº °Å´ëÇÑ ¹®ÀÚ¿­À» ±¸ÃàÇÒ ¶§ ´ë´ÜÈ÷ ÈçÇÑ ±×¸®°í Àç¾ÓÀ» ÀÏÀ¸Å³ ¸¸ÇÑ ½Ç¼ö°¡ µË´Ï´Ù. ºñ½ÁÇϰÔ, ¸¸¾à ¿©·¯ºÐÀÌ ÀÏ·ÃÀÇ ¹®ÀÚ¿­À» ¿¬¼ÓÀûÀ¸·Î »ý¼ºÇÏ·Á¸é, ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏ´Â ´ë½Å¿¡,

str = ""
   for x list:
       str = str + some_function(x)
´ÙÀ½À» »ç¿ëÇϼ¼¿ä
str = [None]*len(list):
   for i in range(len(list):
       str[i] = some_function(list[i])
   str = "".join(str)

´ÙÀ½Àº ÇÇÇϼ¼¿ä:

out = "" + head + prologue + query + tail + "
´ë½Å¿¡, ´ÙÀ½À» »ç¿ëÇϼ¼¿ä
out = "%s%s%s%s" % (head, prologue, query, tail)

À̰ÍÀÌ ÈξÀ ºü¸£¸ç, º¯°æÇϱ⵵ ¿ª½Ã ´õ ½±½À´Ï´Ù. °Ô´Ù°¡, ÀÏÀ» ó¸®ÇÏ´Â ±× ´À¸° ¹æ¹ýÀº ÆÄÀ̽ã 2.0¿¡¼­ dzºÎÇÑ ¿¬»êÀÚ°¡ Ãß°¡µÊ¿¡ µû¶ó¼­ ´õ¿í ´À·ÁÁ³½À´Ï´Ù. ÀÌÁ¦ ÆÄÀ̽㠰¡»ó ±â°è´Â ¸¹Àº ½Ã°£À» µé¿©¾ß ¹®ÀÚ¿­À» ¿¬°áÇÏ´Â ¹ýÀ» ÀÌÇØÇÕ´Ï´Ù. (ÆÄÀ̽ãÀº ¸ðµç ¸Þ½îµå ÂüÁ¶¸¦ ½ÇÇà½Ã¿¡ ÇÑ´Ù´Â °ÍÀ» ÀØÁö ¸¶¼¼¿ä.)

ȸµ¹ÀÌ

ÆÄÀ̽ãÀº ¸¹Àº ȸµ¹ÀÌ ±¸Á¶¸¦ Á¦°øÇÕ´Ï´Ù. for ¼­¼ú¹®ÀÌ °¡Àå ÈçÇÏ°Ô »ç¿ëµË´Ï´Ù. ±×°ÍÀº ¿¬¼Ó¿­ÀÇ ¿ä¼ÒµéÀ» ȸµ¹ÀÌ Çϸ鼭, °¢ ¿ä¼Ò¸¦ ȸµ¹ÀÌ º¯¼ö¿¡ ÇÒ´çÇÕ´Ï´Ù. ¸¸¾à ȸµ¹ÀÌ ¸öü°¡ °£°áÇÏ´Ù¸é, for ȸµ¹ÀÌ ±× ÀÚüÀÇ ÀÎÅÍÇÁ¸®ÅÍ ºÎ´ãÀÌ ½ÇÁ¦ÀûÀÎ ºÎ´ãÀÏ °ÍÀÔ´Ï´Ù. ÀÌ ¶§°¡ ¹Ù·Î map ÇÔ¼ö°¡ Æí¸®ÇÑ °÷ÀÔ´Ï´Ù. ¿©·¯ºÐÀº mapÀ» C ÄÚµå·Î À̵¿ÇÑ for¶ó°í »ý°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿ÀÁ÷ À¯ÀÏÇÑ Á¦ÇÑÀº mapÀÇ "ȸµ¹ÀÌ ¸öü"°¡ ¹Ýµå½Ã ÇÔ¼ö È£ÃâÀ̾î¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.

¿©±â¿¡ ½¬¿î ¿¹Á¦ Çϳª°¡ ÀÖ½À´Ï´Ù. ´Ü¾îµéÀÇ ¸®½ºÆ®¸¦ ȸµ¹ÀÌÇÏ¿© ±×°ÍµéÀ» ´ë¹®ÀÚ·Î º¯°æÇÏ´Â ´ë½Å¿¡:

newlist = []
for word in list:
    newlist.append(word.upper())
mapÀ» »ç¿ëÇÏ¿© ÀÎÅÍÇÁ¸®ÅÍÀÇ È¸µ¹À̸¦ ÄÄÆÄÀÏµÈ C ÄÚµå ¾ÈÀ¸·Î ¹Ð¾î ³ÖÀ» ¼ö ÀÖ½À´Ï´Ù:
import string
newlist = map(string.upper, list)

¸®½ºÆ® ¹ø¿ªÀº ÆÄÀ̽ã 2.0¿¡µµ Ãß°¡µÇ¾ú½À´Ï´Ù. ±¸¹®ÀûÀ¸·Î ´õ¿í °£°áÇÏ°Ô À§ÀÇ for ȸµ¹À̸¦ ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» Á¦°øÇÕ´Ï´Ù:

newlist = [s.upper() for s in list]
±×·¸Áö¸¸, ½ÇÁ¦·Î´Â for ȸµ¹ÀÌ ¹öÀüº¸´Ù´Â ÀüÇô ´õ ºü¸£Áö ¾Ê½À´Ï´Ù.

±Íµµ ¹Ý ·Î¼¶(Guido van Rossum)Àº ȸµ¹ÀÌ ÃÖÀûÈ­¿¡ ´ëÇÏ¿© ´õ¿í ´õ ÀÚ¼¼ÇÑ ¿¹Á¦¸¦ ÀÛ¼ºÇÏ¿´´Âµ¥ ºÐ¸íÈ÷ ÀÐÀ» ¸¸ÇÑ °¡Ä¡°¡ ÀÖ½À´Ï´Ù.

Á¡À» ÇÇÇϱâ...

mapÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù´Â °ÍÀÌ »ó»óµË´Ï±î? ¸®½ºÆ®¿¡¼­ ´Ü¾îµéÀ» ´ë¹®ÀÚ·Î ¹Ù²Ù´Â À§ÀÇ ¿¹Á¦¿¡´Â ¶Ç ´Ù¸¥ ºñÈ¿À²¼ºÀÌ ÀÖ½À´Ï´Ù. newlist.append¿Í string.upper µÑ ¸ðµÎ´Â ÇÔ¼ö ÂüÁ¶·Î¼­ ±× ȸµ¹À̸¦ µ¹ ¶§¸¶´Ù Àç°è»êµË´Ï´Ù. ¿ø·¡ÀÇ È¸µ¹ÀÌ´Â ´ÙÀ½°ú °°ÀÌ ´ëüµÉ ¼ö ÀÖ½À´Ï´Ù:
import string
upper = string.upper
newlist = []
append = newlist.append
for word in list:
    append(upper(word))

Áö¿ª º¯¼öµé

for ȸµ¹ÀÌÀÇ ºñ-map ¹öÀüÀ» À§ÇØ À̿밡´ÉÇÑ ¸¶Áö¸· ¼ÓµµÁõ°¡ ¹æ¹ýÀº °¡´ÉÇϸé Áö¿ª º¯¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. À§ÀÇ È¸µ¹À̰¡ ÇÔ¼ö·Î¼­ ÁÖ¾îÁö¸é, append¿Í upper´Â Áö¿ª º¯¼ö°¡ µË´Ï´Ù.

def func():
    upper = string.upper
    newlist = []
    append = newlist.append
    for word in words:
	append(upper(word))
    return newlist
Ãß°¡ÀûÀÎ ¼ÓµµÁõ°¡°¡ ¾ò¾îÁö´Âµ¥, Áö¿ª º¯¼ö´Â ¸ðµâ ¿µ¿ª¿¡¼­ÀÇ º¯¼öº¸´Ù ´õ¿í È¿À²ÀûÀ¸·Î Á¢±ÙµÇ±â ¶§¹®ÀÔ´Ï´Ù. ³ªÀÇ ÄÄÇ»ÅÍ¿¡¼­ (100MHz Pentium running BSDI), /usr/share/dict/words¿¡ ÀÖ´Â ´Ü¾îµéÀÇ (38,470 ´Ü¾î) ¸®½ºÆ®¸¦ ´ë¹®ÀÚ·Î ¹Ù²Ù´Âµ¥ ´ÙÀ½°ú °°Àº ½Ã°£À» ¾ò¾ú½À´Ï´Ù:

Version Time (seconds)
Basic loop 3.47
Eliminate dots 2.45
Local variable & no dots 1.79
Using map function 0.54

mapÀ» »ç¿ëÇÏ¿© ȸµ¹ÀÌ ºÎ´ãÀ» Á¦°ÅÇÏ´Â °ÍÀº °¡²ûÀº °¡Àå È¿À²ÀûÀÎ ¼±ÅÃÀÔ´Ï´Ù. ±×·¸Áö¸¸, ȸµ¹ÀÌÀÇ º¹À⼺ ¶§¹®¿¡ »ç¿ëÀÌ ¸Á¼³¿©Áø´Ù¸é, ´Ù¸¥ Å×Å©´Ð ¶ÇÇÑ È¸µ¹ÀÌÀÇ ¼Óµµ¸¦ Áõ°¡½Ã۴µ¥ À̿밡´ÉÇÕ´Ï´Ù.

»çÀü ¿ä¼ÒµéÀ» ÃʱâÈ­Çϱâ

´Ü¾îÀÇ ÃâÇö ºóµµ¸¦ ´ãÀº »çÀüÀ» ±¸ÃàÇϰí ÀÖ°í ÀÌ¹Ì ´Ü¾îµéÀ» ¸®½ºÆ®·Î Âɰ³¾ú´Ù°í °¡Á¤ÇØ º¸¼¼¿ä. ¾Æ¸¶ ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇϰÚÁö¿ä:

wdict = {}
for word in words:
    if not wdict.has_key(word): wdict[word] = 0
    wdict[word] = wdict[word] + 1

ÃÖÃʸ¦ Á¦¿ÜÇϰí, ´Ü¾î°¡ ¹ß°ßµÉ ¶§ ¸¶´Ù if ¼­¼ú¹®ÀÇ Å×½ºÆ®´Â ½ÇÆÐÇÕ´Ï´Ù. ¸¸¾à ¾öû³­ °³¼öÀÇ ´Ü¾îµéÀ» ¼¼·Á°í ÇÑ´Ù¸é, ¿©·¯¹ø ÃâÇöÇÏ´Â °ÍÀÌ ¾Æ¸¶µµ ¸¹À» °ÍÀÔ´Ï´Ù. ÇϳªÀÇ °ªÀ» ÃʱâÈ­ÇÏ´Â °ÍÀÌ ´Ü Çѹø¸¸ ÀϾ °ÍÀÌ°í ±× °ªÀÇ Áõ°¡´Â ¿©·¯¹ø ÀϾ´Â »óȲ¿¡¼­´Â, try ¼­¼ú¹®À» »ç¿ëÇÏ´Â °ÍÀÌ Ç°ÀÌ ´ú µì´Ï´Ù:

wdict = {}
for word in words:
    try:
        wdict[word] = wdict[word] + 1
    except KeyError:
        wdict[word] = 1

Áß¿äÇÑ °ÍÀº ¿¹»óµÇ´Â ¿¹¿Ü¸¦ ³ªÆ÷ÇÏ´Â °ÍÀÌÁö, ¿©·¯ºÐÀÌ ½ÇÁ¦·Î try Àý¿¡¼­ ¼­¼ú¹®À¸·Î ¿¹¿Ü¸¦ ó¸®ÇÏÁö ¸øÇÒ ¶§ ±× ¿¹¿Ü·ÎºÎÅÍ º¹±¸ÇÏ·Á´Â ½Ãµµ¸¦ ȸÇÇÇÏ·Á´Â Àǵµ·Î, ±âº» exceptÀýÀ» °¡Áö´Â °ÍÀÌ Áß¿äÇÑ °ÍÀÌ ¾Æ´Õ´Ï´Ù.

ÁÖ¸ñÇÒ °ÍÀº ¸¸¾à try ÀýÀÌ ´ëºÎºÐÀÇ °æ¿ì¿¡ ¿¹¿Ü¸¦ »ý¼ºÇÑ´Ù¸é, ¿¹¿Ü¸¦ ÀÏÀ¸Å°°í ±×°ÍÀ¸·ÎºÎÅÍ º¹±¸ÇÏ´Â °Íº¸´Ù´Â ¿¹¿ÜÀûÀÎ Á¶°ÇÀ» Å×½ºÆ®ÇÏ´Â °ÍÀÌ ¶§·Î´Â ´õ¿í È¿°úÀûÀÏ °ÍÀÔ´Ï´Ù.

Import ¼­¼ú¹® ºÎ´ã

import ¼­¼ú¹®Àº ¾î´À °÷¿¡¼­³ª ½ÇÇàµÉ ¼ö ÀÖ½À´Ï´Ù. ¶§·Î´Â ±×°ÍµéÀ» ÇÔ¼ö¾È¿¡ µÎ¾î ±×µéÀÇ °¡½Ã¼ºÀ» Á¦ÇÑÇϰųª ÃʱâÈ­ ±âµ¿½Ã°£À» °¨¼Ò½ÃŰ´Â °ÍÀÌ À¯¿ëÇÕ´Ï´Ù. ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍ´Â °°Àº ¸ðµâÀ» ¿©·¯¹ø ¼öÀÔÇÏÁö ¾Êµµ·Ï ÃÖÀûÈ­ µÇ¾î ÀÖ±â´Â ÇÏÁö¸¸, ¼öÀÔ ¼­¼ú¹®À» ¹Ýº¹ÀûÀ¸·Î ½ÇÇàÇÏ¸é ¾î¶² »óȲ¿¡¼­´Â ¼öÇà¼Óµµ¿¡ ½É°¢ÇÑ ¿µÇâÀ» ÁÙ ¼ö ÀÖ½À´Ï´Ù.

´ÙÀ½ÀÇ µÎ °³ÀÇ Á¶°¢ Äڵ带 ¿¬±¸ÇØ º¸¼¼¿ä (³»°¡ ¹Ï±â·Î, ±×·¹±× ¸ÆÆÈ·¹ÀÎ(Greg McFarlane)À¸·Î ºÎÅÍ ÀοëÇÔ, - comp.lang.python/python-list@python.org¿¡ ¿Ã·ÁÁø ±Û¿¡¼­´Â ´©±ºÀÌÁö ¸ô¶úÀ¸³ª ³ªÁß¿¡ ´Ù¸¥ ¼Ò½º·ÎºÎÅÍ ±×ÀÇ ±ÛÀÎÁö ¾Ë¾Ò½À´Ï´Ù):

def doit():
    import string             ###### import statement inside function
    string.lower('Python')

for num in range(100000):
    doit()
¶Ç´Â:
import string             ###### import statement outside function
def doit():
    string.lower('Python')

for num in range(100000):
    doit()
±× ¹®ÀÚ¿­ ¸ðµâ¿¡ ´ëÇÑ ÂüÁ¶Á¡ÀÌ µÎ ¹øÂ° ¿¹Á¦¿¡¼­´Â Àü¿ªÀÓ¿¡µµ ºÒ±¸Çϰí, µÎ ¹øÂ° ¹öÀüÀº ù ¹øÂ°º¸´Ù »ó´çÈ÷ ºü¸£°Ô ½ÇÇàµÉ °ÍÀÔ´Ï´Ù. String ¸Þ½îµå´Â ÆÄÀ̽ã 2.0¿¡¼­ µµÀԵǾú½À´Ï´Ù. À̰ÍÀ¸·Î import¸¦ ¿ÏÀüÇÏ°Ô ÇÇÇÏ°Ô µÇ¾ú½À´Ï´Ù:
def doit():
    'Python'.lower()

for num in range(100000):
    doit()

À§ÀÇ ¿¹Á¦´Â °Ñº¸±â¿¡ ¾à°£ ²Ù¹Î°¨ÀÌ ÀÖÁö¸¸, ÀÏ¹Ý ¿ø¸®´Â À¯ÁöÇϰí ÀÖ½À´Ï´Ù.

mapÀ» »çÀü°ú »ç¿ëÇϱâ

mapÀ» »ç¿ëÇÏ¿© ´ÙÀ½°ú °°Àº °£´ÜÇÑ for ȸµ¹À̸¦ Á¦°ÅÇÏ·Á°í ÇÒ¶§ ´çȲ½º·¯¿ü´Âµ¥ ±× ÀÌÀ¯´Â:

dict = {}
nil = []
for s in list:
    dict[s] = nil
lambda ÇüŸ¦ »ç¿ëÇØ¾ß Çß°í ¶Ç´Â À̸§Áö¾îÁø ÇÔ¼ö (named function)¸¦ Á¤ÀÇÇØ¾ß Çߴµ¥ À̰ÍÀº ³»°¡ óÀ½¿¡ map ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ ¾òÀ¸·Á°í Çß´ø ¼Óµµ¸¦ ¾Æ¸¶µµ ºÎÀÎÇÏ´Â °ÍÀ̾ú±â ¶§¹®ÀÔ´Ï´Ù. »çÀüÀÇ Å°¿Í °ªµéÀ» ÇѲ¨¹ø¿¡ ¼³Á¤, ȹµæ ȤÀº »èÁ¦Çϵµ·Ï ÇÏ¿© ÁÖ´Â ¾î¶² ÇÔ¼öµéÀÌ ÇÊ¿äÇÏ´Ù°í °áÁ¤ÇÏ¿´½À´Ï´Ù. ÆÄÀ̽ãÀÇ »çÀü °´Ã¼¿¡ º¯°æÀ» ÇÏ°í¼­ Àá½Ã°£ ±×°ÍÀ» »ç¿ëÇÏ¿´½À´Ï´Ù. ±×·¸Áö¸¸, ´õ¿í ÀϹÝÀûÀÎ ÇØ¹ýÀÌ ÆÄÀ̽ã 1.4¿¡ operator ¸ðµâ¿¡ ¸ð½ÀÀ» ³ªÅ¸³Â½À´Ï´Ù. ¸®½ºÆ®¸¦ °¡Áö°í ÀÖ°í À§ÀÇ ÄÚµå ´ë½Å¿¡ Áߺ¹¿ä¼Ò¸¦ Á¦°ÅÇÏ°í ½Í´Ù°í °¡Á¤ÇØ º¸¼¼¿ä, ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù:
dict = {}
map(operator.setitem, [dict]*len(list), list, [])
list = statedict.keys()
À̰ÍÀº for ȸµ¹À̸¦ C ¾ÈÀ¸·Î À̵¿½ÃÄÑ ´õ ºü¸£°Ô ½ÇÇà½Ãŵ´Ï´Ù.

µ¥ÀÌŸ ¸ðÀ¸±â(Data Aggregation)

(¾Æ·Ð ¿öÅͽº(Aaron Watters)ÀÇ ¸Þ¸ð·ÎºÎÅÍ ÀοëÇÔ)

ÆÄÀ̽㿡¼­ ÇÔ¼ö È£Ã⠺δãÀº, ƯÈ÷ ³»Àå ÇÔ¼öÀÇ ½ÇÇà ¼Óµµ¿¡ ºñ±³ÇØ º»´Ù¸é »ó´ëÀûÀ¸·Î ³ô½À´Ï´Ù. À̰ÍÀ¸·Î È®½ÇÈ÷ ¾Ë ¼ö ÀÖ´Â °ÍÀº, È®Àå ¸ðµâ ÇÔ¼ö´Â µ¥ÀÌŸ ¸ðÀ½À» °¡´ÉÇÑ °÷¿¡¼­ ó¸®ÇؾßÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ¿©±â¿¡ ÆÄÀ̽ãÀ¸·Î ÀÛ¼ºµÇ¾î °í¾ÈµÈ ¿¹Á¦°¡ ÀÖ½À´Ï´Ù. (´ÜÁö ±× ÇÔ¼ö°¡ C ·Î ÀÛ¼ºµÈ °Íó·³ °¡ÀåÇϰí ÀÖ½À´Ï´Ù. :-)

x = 0
def doit(i):
    global x
    x = x + i

list = range(10000)
for i in list:
    doit(i)
´ÙÀ½°ú ºñ±³Çϸé,
x = 0
def doit(list):
    global x
    for i in list:
	x = x + i

list = range(10000)
doit(list)
½ÉÁö¾î´Â ÆÄÀ̽ãÀ¸·Î ¾º¿©Á³À½¿¡µµ, µÎ ¹øÂ° ¿¹Á¦°¡ ù ¹øÂ°º¸´Ù ¾à ³×¹è ´õ ºü¸¨´Ï´Ù. ¸¸¾à doitÀÌ C ·Î ÀÛ¼ºµÇ¾ú´Ù¸é, ±× Â÷ÀÌ´Â ÈξÀ ´õ ÄÇÀ» °ÍÀÔ´Ï´Ù (ÆÄÀ̽ãÀÇ for ȸµ¹À̸¦ C ÀÇfor ȸµ¹ÀÌ·Î ±³È¯ÇÏ¿´À¸¸ç ±×¸®°í ÇÔ¼ö È£ÃâÀ» Á¦°ÅÇÏ¿´±â ¶§¹®ÀÔ´Ï´Ù).

ÀÚÁÖ ÀϾÁö ¾Ê´Â »ç°Ç ó¸®Çϱâ

ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍ´Â ¾à°£ÀÇ ÁÖ±âÀûÀÎ Á¡°ËÀ» ¼öÇàÇÕ´Ï´Ù. ƯÈ÷, ¶Ç ´Ù¸¥ ¾²·¹µå¸¦ ¼öÇàÇϵµ·Ï ÇÒ °ÍÀΰ¡ ¸»°ÍÀΰ¡¸¦ °áÁ¤Çϰí Á¤ÁöµÈ È£ÃâÀ» (ÀüÇüÀûÀ¸·Î ½ÅÈ£ ó¸®ÀÚ¿¡ ÀÇÇØ ±¸ÃàµÈ È£ÃâÀ») ½ÇÇàÇÒ °ÍÀÎÁö ¸»ÁöÀÎÁö¸¦ °áÁ¤ÇÕ´Ï´Ù. ´ëºÎºÐÀÇ °æ¿ì¿¡´Â ÇÒÀÏÀÌ ¾ø½À´Ï´Ù, ±×·¡¼­ ÀÌ·¯ÇÑ Á¡°ËÀ» ¼öÇàÇÏ°Ô µÇ¸é ÀÎÅÍÇÁ¸®ÅÍÀÇ È¸µ¹À̸¦ Åë°úÇÒ ¶§ ¸¶´Ù ¼Óµµ¸¦ ¶³¾î¶ß¸± ¼ö ÀÖ½À´Ï´Ù. sys ¸ðµâ¿¡´Â, ÇÔ¼ö setcheckintervalÀÌ Àִµ¥, ±×°ÍÀ» È£ÃâÇÏ¿© ÀÌ·¯ÇÑ ÁÖ±âÀûÀÎ Á¡°ËÀ» ¾ó¸¶³ª ÀÚÁÖ ÇÒ °ÍÀΰ¡¸¦ ÀÎÅÍÇÁ¸®ÅÍ¿¡°Ô ¸í·ÉÇÒ ¼ö ÀÖ½À´Ï´Ù. ÆÄÀ̽ã 1.4 ¿¡¼­ ±âº» °ªÀº 10ÀÔ´Ï´Ù. ¸¸¾à ¾²·¹µå·Î ½ÇÇàÇÏÁö ¾ÊÀ» °ÍÀ̶ó¸é ±×¸®°í ¼ö ¸¹Àº ½ÅÈ£¸¦ ³ªÆ÷ÇÒ °Í °°Áö ¾Ê´Ù¸é, À̰ÍÀ» Å« °ªÀ¸·Î ¼³Á¤Çϸé ÀÎÅÍÇÁ¸®ÅÍÀÇ ¼º´ÉÀ», ¾î¶² ¶§´Â »ó´çÈ÷, ÁõÁø ½Ãų ¼ö ÀÖ½À´Ï´Ù.


Skip Montanaro
(skip@pobox.com)
2001.11.02
(johnsonj)

¸¶Áö¸·À¸·Î ¼öÁ¤µÊ: Thu Jul 12 12:02:02 CDT 2001