์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ ํŒŒ์ด์ฌ ํ”„๋กœํŒŒ์ผ๋ง: cProfile ์‚ฌ์šฉ๋ฒ• ๋งˆ์Šคํ„ฐํ•˜๊ธฐ ๐Ÿš€

๐Ÿ ํŒŒ์ด์ฌ ํ”„๋กœํŒŒ์ผ๋ง: cProfile ์‚ฌ์šฉ๋ฒ• ๋งˆ์Šคํ„ฐํ•˜๊ธฐ ๐Ÿš€

์•ˆ๋…•ํ•˜์„ธ์š”, ํŒŒ์ด์ฌ ๋•ํ›„ ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ๊ฟ€์žผ ๊ฐ€๋“ํ•œ ์ฃผ์ œ๋กœ ์ฐพ์•„์™”์–ด์š”. ๋ฐ”๋กœ ํŒŒ์ด์ฌ ํ”„๋กœํŒŒ์ผ๋ง๊ณผ cProfile ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ๊นŠ~๊ฒŒ ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด๊ฑฐ ์™„์ „ ๋Œ€๋ฐ• ๊ฟ€ํŒ์ด์—์š”! ๐Ÿ˜Ž

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์ž์‹ ์˜ ์ฝ”๋“œ๊ฐ€ ๊ฑฐ๋ถ์ด์ฒ˜๋Ÿผ ๋А๋ฆฌ๊ฒŒ ์›€์ง์ด๋Š” ๊ฒƒ ๊ฐ™์•„ ๊ณ ๋ฏผํ•ด๋ณธ ์  ์žˆ๋‚˜์š”? ์•„๋‹ˆ๋ฉด ์–ด๋–ค ๋ถ€๋ถ„์—์„œ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์ฐพ๊ณ  ์‹ถ์—ˆ๋˜ ์  ์žˆ๋‚˜์š”? ๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ๋Ÿฌ๋ถ„์€ ์ง€๊ธˆ ๋”ฑ ๋งž๋Š” ๊ณณ์— ์˜ค์…จ์–ด์š”! ๐Ÿ‘๐Ÿ‘๐Ÿ‘

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ํŒŒ์ด์ฌ์˜ ์ˆจ๊ฒจ์ง„ ๋ณด๋ฌผ ๊ฐ™์€ ๋„๊ตฌ, cProfile์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด ๋„๊ตฌ๋Š” ๋งˆ์น˜ ์šฐ๋ฆฌ ์ฝ”๋“œ์˜ MRI ์Šค์บ”์ฒ˜๋Ÿผ ์ž‘๋™ํ•ด์„œ, ์–ด๋–ค ๋ถ€๋ถ„์ด ๋А๋ฆฌ๊ณ  ๋น„ํšจ์œจ์ ์ธ์ง€ ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„๋‚ด์ค˜์š”. ์™„์ „ ์‹ ๊ธฐํ•˜์ง€ ์•Š๋‚˜์š”? ๐Ÿง

๊ทธ๋Ÿผ ์ด์ œ๋ถ€ํ„ฐ cProfile์˜ ์„ธ๊ณ„๋กœ ๋น ์ ธ๋ณผ๊นŒ์š”? ์ค€๋น„๋˜์…จ๋‚˜์š”? ์ž, ๊นŠ์€ ์ˆจ์„ ํ•œ๋ฒˆ ๋“ค์ด์‰ฌ๊ณ ... ์‹œ์ž‘ํ•ด๋ณผ๊ฒŒ์š”! ๐ŸŠโ€โ™‚๏ธ

๐Ÿ” ํ”„๋กœํŒŒ์ผ๋ง์ด ๋ญ๊ธธ๋ž˜? ์™œ ํ•„์š”ํ•œ ๊ฑฐ์•ผ?

์ž, ์—ฌ๋Ÿฌ๋ถ„! ํ”„๋กœํŒŒ์ผ๋ง์ด ๋ญ”์ง€ ์•„์‹œ๋‚˜์š”? ๋ชจ๋ฅด์…”๋„ ๊ดœ์ฐฎ์•„์š”. ์ง€๊ธˆ๋ถ€ํ„ฐ ์•„์ฃผ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”. ๐Ÿ˜‰

ํ”„๋กœํŒŒ์ผ๋ง์€ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ ์„ฑ๋Šฅ์„ ๋ถ„์„ํ•˜๋Š” ๊ณผ์ •์ด์—์š”. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ, ์šฐ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜๋Š”์ง€, ์–ด๋–ค ๋ถ€๋ถ„์—์„œ ์‹œ๊ฐ„์„ ๋งŽ์ด ์žก์•„๋จน๋Š”์ง€ ๋“ฑ์„ ์ž์„ธํžˆ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ๊ฑฐ์ฃ . ๋งˆ์น˜ ์˜์‚ฌ๊ฐ€ ํ™˜์ž์˜ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”!

๊ทผ๋ฐ ์™œ ์ด๋Ÿฐ ๊ฒŒ ํ•„์š”ํ• ๊นŒ์š”? ๐Ÿค”

  • ์ฒซ์งธ, ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด์„œ์˜ˆ์š”. ์šฐ๋ฆฌ ์ฝ”๋“œ ์ค‘์—์„œ ์–ด๋–ค ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ๋А๋ฆฐ์ง€ ์•Œ๋ฉด, ๊ทธ ๋ถ€๋ถ„์„ ์ง‘์ค‘์ ์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์ž–์•„์š”?
  • ๋‘˜์งธ, ๋ณ‘๋ชฉ ํ˜„์ƒ ํŒŒ์•…์„ ์œ„ํ•ด์„œ์ฃ . ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ์ค‘์—์„œ ์–ด๋–ค ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ์‹œ๊ฐ„์„ ๋งŽ์ด ์žก์•„๋จน๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์–ด์š”.
  • ์…‹์งธ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ถ„์„์„ ์œ„ํ•ด์„œ์˜ˆ์š”. ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€, ์–ด๋””์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ผ์–ด๋‚˜๋Š”์ง€ ๋“ฑ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์ฃ .
  • ๋„ท์งธ, ์ฝ”๋“œ ํ’ˆ์งˆ ํ–ฅ์ƒ์„ ์œ„ํ•ด์„œ์˜ˆ์š”. ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์šฐ๋ฆฌ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ œ์ ๋„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์–ด์š”.

์™€~ ์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ๊นŒ ํ”„๋กœํŒŒ์ผ๋ง ์—„์ฒญ ์ค‘์š”ํ•˜์ฃ ? ๐Ÿ˜ฒ

์‚ฌ์‹ค ํ”„๋กœํŒŒ์ผ๋ง์€ ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์šด๋™ํ•  ๋•Œ ์‹ฌ๋ฐ•์ˆ˜ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์ฐจ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”. ์‹ฌ๋ฐ•์ˆ˜ ๋ชจ๋‹ˆํ„ฐ๊ฐ€ ์šฐ๋ฆฌ ๋ชธ์˜ ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•Œ๋ ค์ฃผ๋“ฏ์ด, ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋Š” ์šฐ๋ฆฌ ์ฝ”๋“œ์˜ '๊ฑด๊ฐ• ์ƒํƒœ'๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฑฐ์˜ˆ์š”.

๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ! ํ”„๋กœํŒŒ์ผ๋ง์€ ๋‹จ์ˆœํžˆ '๋А๋ฆฐ ๋ถ€๋ถ„'์„ ์ฐพ๋Š” ๊ฒŒ ์•„๋‹ˆ์—์š”. ๊ทธ๊ฒƒ๋ณด๋‹ค๋Š” ์ „์ฒด์ ์ธ ์ฝ”๋“œ์˜ ํ๋ฆ„๊ณผ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„๋‚ด๋Š” ๊ณผ์ •์ด์—์š”. ๋งˆ์น˜ ํผ์ฆ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์šฐ๋ฆฌ ์ฝ”๋“œ์˜ ๊ฐ ๋ถ€๋ถ„์ด ์–ด๋–ป๊ฒŒ ๋งž๋ฌผ๋ ค ๋Œ์•„๊ฐ€๋Š”์ง€ ํฐ ๊ทธ๋ฆผ์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฑฐ์ฃ .

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์žฌ๋Šฅ๋„ท์ด๋ผ๋Š” ์‚ฌ์ดํŠธ ์•„์„ธ์š”? ์ด ์‚ฌ์ดํŠธ๋Š” ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๊ฑฐ๋ž˜ํ•˜๋Š” ํ”Œ๋žซํผ์ธ๋ฐ์š”, ๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋Ÿฐ ๊ณณ์—์„œ ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์–ด์š”. ํ”„๋กœํŒŒ์ผ๋ง ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋  ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜Š

์ž, ์ด์ œ ํ”„๋กœํŒŒ์ผ๋ง์ด ๋ญ”์ง€, ์™œ ํ•„์š”ํ•œ์ง€ ๋Œ€์ถฉ ๊ฐ์ด ์˜ค์‹œ๋‚˜์š”? ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ cProfile์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ์ฐจ๋ก€์˜ˆ์š”! ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's go~ ๐Ÿš€

๐Ÿ› ๏ธ cProfile: ํŒŒ์ด์ฌ์˜ ์ˆจ๊ฒจ์ง„ ๋ณด๋ฌผ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์ฃผ์ธ๊ณต cProfile์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ์‹œ๊ฐ„์ด์—์š”! cProfile์€ ํŒŒ์ด์ฌ์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋œ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ์˜ˆ์š”. ์™„์ „ ๋Œ€๋ฐ•์ด์ฃ ? ๋”ฐ๋กœ ์„ค์น˜ํ•  ํ•„์š”๋„ ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋‹ˆ! ๐Ÿ‘

cProfile์€ ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ์ธก์ •ํ•ด์ฃผ๋Š” ๋„๊ตฌ์˜ˆ์š”. ๊ฐ ํ•จ์ˆ˜๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€, ๊ฐ ํ˜ธ์ถœ์— ์–ผ๋งˆ๋‚˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋Š”์ง€ ๋“ฑ์„ ์ƒ์„ธํ•˜๊ฒŒ ์•Œ๋ ค์ค˜์š”. ๋งˆ์น˜ ์šฐ๋ฆฌ ์ฝ”๋“œ์˜ GPS๊ฐ™์€ ๊ฑฐ์ฃ ! ๐Ÿ—บ๏ธ

cProfile์˜ ์žฅ์ ์€ ๋ญ˜๊นŒ์š”? ํ•œ๋ฒˆ ์•Œ์•„๋ณผ๊นŒ์š”?

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

์™€~ ์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ๊นŒ cProfile ์™„์ „ ๋Œ€๋ฐ•์ด์ฃ ? ๐Ÿ˜

๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ์ž ๊น! cProfile์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๋„ ์žˆ์–ด์š”.

์ฃผ์˜์‚ฌํ•ญ:

  • cProfile์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์†๋„๋ฅผ ์กฐ๊ธˆ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์–ด์š”. ํŠนํžˆ ๋งค์šฐ ๋น ๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ž์ฃผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์— ๊ทธ๋ž˜์š”.
  • ๊ฒฐ๊ณผ ํ•ด์„์— ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ด์š”. ๋‹จ์ˆœํžˆ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ธด ํ•จ์ˆ˜๊ฐ€ ํ•ญ์ƒ ๋ฌธ์ œ๋Š” ์•„๋‹ ์ˆ˜ ์žˆ์–ด์š”.
  • I/O ๋ฐ”์šด๋“œ ์ž‘์—…(ํŒŒ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ, ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋“ฑ)์˜ ๊ฒฝ์šฐ, cProfile๋งŒ์œผ๋กœ๋Š” ์ •ํ™•ํ•œ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ฐพ๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์–ด์š”.

์ด๋Ÿฐ ์ ๋“ค์„ ์—ผ๋‘์— ๋‘๊ณ  ์‚ฌ์šฉํ•˜๋ฉด, cProfile์€ ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ๋  ๊ฑฐ์˜ˆ์š”! ๐Ÿ‘Š

์ž, ์ด์ œ cProfile์— ๋Œ€ํ•ด ์–ด๋А ์ •๋„ ๊ฐ์ด ์˜ค์‹œ๋‚˜์š”? ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ cProfile์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ๋‹ค์Œ ์„น์…˜์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜†

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

์ž, ๊ทธ๋Ÿผ ์ด์ œ cProfile ์‚ฌ์šฉ๋ฒ•์œผ๋กœ ๋„˜์–ด๊ฐ€๋ณผ๊นŒ์š”? ์ค€๋น„๋˜์…จ์ฃ ? Let's dive in! ๐ŸŠโ€โ™‚๏ธ

๐ŸŽฎ cProfile ์‚ฌ์šฉ๋ฒ•: ์ดˆ๋ณด์ž๋„ ์‰ฝ๊ฒŒ ๋”ฐ๋ผํ•˜๊ธฐ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ cProfile์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ฑฑ์ • ๋งˆ์„ธ์š”, ์ƒ๊ฐ๋ณด๋‹ค ํ›จ์”ฌ ์‰ฌ์›Œ์š”! ๋งˆ์น˜ ๊ฒŒ์ž„ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์žฌ๋ฏธ์žˆ๊ฒŒ ๋ฐฐ์›Œ๋ณผ๊ฒŒ์š”. ๐Ÿ˜‰

1. cProfile ์ž„ํฌํŠธํ•˜๊ธฐ

๋จผ์ €, cProfile์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด๋ฅผ ์ž„ํฌํŠธํ•ด์•ผ ํ•ด์š”. ์•„์ฃผ ๊ฐ„๋‹จํ•ด์š”!

import cProfile

์งœ์ž”~ ์ด๊ฒŒ ๋์ด์—์š”! ๐Ÿ˜Ž

2. ํ”„๋กœํŒŒ์ผ๋ง ์‹คํ–‰ํ•˜๊ธฐ

์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ถ„์„ํ•˜๊ณ  ์‹ถ์€ ํ•จ์ˆ˜๋‚˜ ์ฝ”๋“œ๋ฅผ ํ”„๋กœํŒŒ์ผ๋ง ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. cProfile.run() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์š”.

def my_function():
    # ์—ฌ๊ธฐ์— ๋ถ„์„ํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์š”
    pass

cProfile.run('my_function()')

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด my_function()์˜ ์‹คํ–‰ ์‹œ๊ฐ„๊ณผ ํ˜ธ์ถœ ํšŸ์ˆ˜ ๋“ฑ์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์™„์ „ ์‰ฝ์ฃ ? ๐Ÿ‘

3. ๊ฒฐ๊ณผ ํ•ด์„ํ•˜๊ธฐ

์ž, ์ด์ œ ํ”„๋กœํŒŒ์ผ๋ง์„ ์‹คํ–‰ํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๊ฑฐ์˜ˆ์š”. ๊ทธ๋Ÿฐ๋ฐ ์ด ๊ฒฐ๊ณผ, ์–ด๋–ป๊ฒŒ ์ฝ์–ด์•ผ ํ• ๊นŒ์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”, ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”! ๐Ÿ˜Š

๊ฒฐ๊ณผ๋Š” ๋ณดํ†ต ์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ๋‚˜์™€์š”:

         5 function calls in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    0.000    0.000    0.000    0.000 test.py:1(my_function)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.print}

์™€~ ๋ญ”๊ฐ€ ๋ณต์žกํ•ด ๋ณด์ด์ฃ ? ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”. ํ•˜๋‚˜์”ฉ ๋œฏ์–ด๋ณผ๊ฒŒ์š”! ๐Ÿง

  • ncalls: ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ํšŸ์ˆ˜์˜ˆ์š”.
  • tottime: ํ•จ์ˆ˜ ์‹คํ–‰์— ๊ฑธ๋ฆฐ ์ด ์‹œ๊ฐ„์ด์—์š” (ํ•˜์œ„ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ๊ฐ„ ์ œ์™ธ).
  • percall: ํ•จ์ˆ˜ ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋‹น ํ‰๊ท  ์‹œ๊ฐ„์ด์—์š” (tottime / ncalls).
  • cumtime: ํ•จ์ˆ˜ ์‹คํ–‰์— ๊ฑธ๋ฆฐ ๋ˆ„์  ์‹œ๊ฐ„์ด์—์š” (ํ•˜์œ„ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ๊ฐ„ ํฌํ•จ).
  • filename:lineno(function): ํ•จ์ˆ˜์˜ ์œ„์น˜์™€ ์ด๋ฆ„์ด์—์š”.

์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ๊นŒ ์ข€ ๋” ์ดํ•ด๊ฐ€ ๋˜์‹œ๋‚˜์š”? ๐Ÿ˜„

4. ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ ์ €์žฅํ•˜๊ธฐ

๋•Œ๋กœ๋Š” ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋Ÿด ๋• ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ผ์š”:

cProfile.run('my_function()', filename='my_profile_results')

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 'my_profile_results'๋ผ๋Š” ํŒŒ์ผ์— ๊ฒฐ๊ณผ๊ฐ€ ์ €์žฅ๋ผ์š”. ๋‚˜์ค‘์— ์ด ํŒŒ์ผ์„ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์™€์„œ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์™„์ „ ํŽธ๋ฆฌํ•˜์ฃ ? ๐Ÿ˜Ž

5. ๋” ๋ณต์žกํ•œ ํ”„๋กœํŒŒ์ผ๋ง

์ข€ ๋” ๋ณต์žกํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ํ”„๋กœํŒŒ์ผ๋งํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, cProfile.Profile ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ์š”:

import cProfile
import pstats

profiler = cProfile.Profile()
profiler.enable()

# ์—ฌ๊ธฐ์— ํ”„๋กœํŒŒ์ผ๋งํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์š”
my_function()

profiler.disable()
stats = pstats.Stats(profiler).sort_stats('cumtime')
stats.print_stats()

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ข€ ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ด์ ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ๋ถ€๋ถ„๋งŒ ํ”„๋กœํŒŒ์ผ๋งํ•œ๋‹ค๊ฑฐ๋‚˜, ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ๐Ÿ˜Š

์™€~ ์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค๋А๋ผ ์ˆ˜๊ณ  ๋งŽ์œผ์…จ์–ด์š”! ์ด์ œ cProfile ์‚ฌ์šฉ๋ฒ•์˜ ๊ธฐ๋ณธ์„ ๋งˆ์Šคํ„ฐํ•˜์…จ์–ด์š”. ๐Ÿ‘๐Ÿ‘๐Ÿ‘

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

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”! ์žฌ๋Šฅ๋„ท์—์„œ๋Š” ์ด๋Ÿฐ ์‹ค์šฉ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๊ฐ•์˜๊ฐ€ ์žˆ์–ด์š”. cProfile ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์„ ๋งˆ์Šคํ„ฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”! ๐ŸŽ“

์ž, ๊ทธ๋Ÿผ ๋‹ค์Œ ์„น์…˜์—์„œ ์‹ค์ œ ์‚ฌ์šฉ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด cProfile์„ ๋” ๊นŠ์ด ์ดํ•ดํ•ด๋ณผ๊นŒ์š”? Let's go! ๐Ÿš€

๐ŸŽญ cProfile ์‹ค์ „ ์‚ฌ์šฉ ์˜ˆ์ œ: ์ฝ”๋“œ ์ตœ์ ํ™”์˜ ๋น„๋ฐ€

์ž, ์ด์ œ ์‹ค์ œ๋กœ cProfile์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์žฌ๋ฏธ์žˆ๊ณ  ์‹ค์šฉ์ ์ธ ์˜ˆ์ œ๋กœ ์ค€๋น„ํ–ˆ์œผ๋‹ˆ ์ง‘์ค‘ํ•ด์ฃผ์„ธ์š”! ๐Ÿ˜‰

์˜ˆ์ œ 1: ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ์ตœ์ ํ™”ํ•˜๊ธฐ

๋จผ์ €, ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”. ๊ทธ๋ฆฌ๊ณ  ์ด ํ•จ์ˆ˜๋ฅผ cProfile๋กœ ๋ถ„์„ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”.

import cProfile

def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

def calculate_fibonacci():
    result = fibonacci(30)
    print(f"Fibonacci(30) = {result}")

cProfile.run('calculate_fibonacci()')

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์š”:

         2692537 function calls (4 primitive calls) in 0.839 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.839    0.839 <string>:1(<module>)
        1    0.000    0.000    0.839    0.839 test.py:7(calculate_fibonacci)
2692537/1    0.839    0.000    0.839    0.839 test.py:2(fibonacci)
        1    0.000    0.000    0.839    0.839 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {built-in method builtins.print}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

Fibonacci(30) = 832040

์™€์šฐ! ๐Ÿ˜ฒ ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด fibonacci ํ•จ์ˆ˜๊ฐ€ ๋ฌด๋ ค 2,692,537๋ฒˆ์ด๋‚˜ ํ˜ธ์ถœ๋˜์—ˆ์–ด์š”! ์ด๊ฑด ์—„์ฒญ๋‚œ ๋‚ญ๋น„์ฃ . ์ด์ œ ์ด ํ•จ์ˆ˜๋ฅผ ์ตœ์ ํ™”ํ•ด๋ณผ๊ฒŒ์š”.

import cProfile

def fibonacci_optimized(n, memo={}):
    if n in memo:
        return memo[n]
    if n < 2:
        return n
    memo[n] = fibonacci_optimized(n-1, memo) + fibonacci_optimized(n-2, memo)
    return memo[n]

def calculate_fibonacci_optimized():
    result = fibonacci_optimized(30)
    print(f"Fibonacci(30) = {result}")

cProfile.run('calculate_fibonacci_optimized()')

์ด์ œ ์ด ์ตœ์ ํ™”๋œ ๋ฒ„์ „์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ๊นŒ์š”?

         62 function calls (33 primitive calls) in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 test.py:12(calculate_fibonacci_optimized)
     31/1    0.000    0.000    0.000    0.000 test.py:3(fibonacci_optimized)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
       27    0.000    0.000    0.000    0.000 {built-in method builtins.len}
        1    0.000    0.000    0.000    0.000 {built-in method builtins.print}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

Fibonacci(30) = 832040

์™€~ ์—„์ฒญ๋‚œ ์ฐจ์ด์ฃ ? ๐Ÿ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ํšŸ์ˆ˜๊ฐ€ 2,692,537๋ฒˆ์—์„œ 62๋ฒˆ์œผ๋กœ ์ค„์—ˆ์–ด์š”! ์‹คํ–‰ ์‹œ๊ฐ„๋„ ๊ฑฐ์˜ 0์ดˆ์— ๊ฐ€๊น๊ฒŒ ์ค„์—ˆ๊ณ ์š”. ์ด๊ฒŒ ๋ฐ”๋กœ cProfile์„ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”!

์˜ˆ์ œ 2: ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋น„๊ตํ•˜๊ธฐ

์ด๋ฒˆ์—๋Š” ๋‘ ๊ฐ€์ง€ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•ด๋ณผ๊ฒŒ์š”. ๋ฒ„๋ธ” ์ •๋ ฌ๊ณผ ํ€ต ์ •๋ ฌ์„ ๊ตฌํ˜„ํ•˜๊ณ , cProfile๋กœ ๋ถ„์„ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”.

import cProfile
import random

def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

def test_sorting():
    arr = [random.randint(1, 1000) for _ in range(1000)]
    bubble_sort(arr.copy())
    quick_sort(arr.copy())

cProfile.run('test_sorting()')

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์š”:

         3019 function calls (2015 primitive calls) in 0.503 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.503    0.503 <string>:1(<module>)
     1000    0.499    0.000    0.499    0.000 test.py:3(bubble_sort)
  1005/1    0.003    0.000    0.003    0.003 test.py:11(quick_sort)
        1    0.001    0.001    0.503    0.503 test.py:19(test_sorting)
        1    0.000    0.000    0.503    0.503 {built-in method builtins.exec}
     1008    0.000    0.000    0.000    0.000 {built-in method builtins.len}
        1    0.000    0.000    0.000    0.000 {method 'copy' of 'list' objects}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
     1001    0.000    0.000    0.000    0.000 {method 'random' of '_random.Random' objects}

์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, ๋ฒ„๋ธ” ์ •๋ ฌ(bubble_sort)์ด ํ€ต ์ •๋ ฌ(quick_sort)๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ์š”ํ•˜๊ณ  ์žˆ์–ด์š”. ๋ฒ„๋ธ” ์ •๋ ฌ์€ 0.499์ดˆ, ํ€ต ์ •๋ ฌ์€ 0.003์ดˆ๋ฐ–์— ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜์–ด์š”. ์—„์ฒญ๋‚œ ์ฐจ์ด์ฃ ? ๐Ÿ˜ฎ

์ด๋ ‡๊ฒŒ cProfile์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ์„ ์‰ฝ๊ฒŒ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ฝ”๋“œ ์ตœ์ ํ™”์˜ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ฃ !

์˜ˆ์ œ 3: ์›น ์Šคํฌ๋ž˜ํ•‘ ์ตœ์ ํ™”ํ•˜๊ธฐ

๋งˆ์ง€๋ง‰์œผ๋กœ, ์›น ์Šคํฌ๋ž˜ํ•‘ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณผ๊ฒŒ์š”. ์ด ์˜ˆ์ œ์—์„œ๋Š” requests์™€ BeautifulSoup ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฑฐ์˜ˆ์š”.

import cProfile
import requests
from bs4 import BeautifulSoup

def scrape_titles():
    url = "https://news.ycombinator.com/"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    titles = soup.find_all('a', class_='storylink')
    return [title.text for title in titles]

def process_titles():
    titles = scrape_titles()
    print(f"Number of titles scraped: {len(titles)}")

cProfile.run('process_titles()')

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์š”:

         219 function calls in 1.234 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    1.234    1.234 <string>:1(<module>)  <p>์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์ด requests.get()๊ณผ BeautifulSoup() ํ•จ์ˆ˜์— ์†Œ์š”๋˜๊ณ  ์žˆ์–ด์š”. ์ด์ œ ์ด ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์„์ง€ ์ƒ๊ฐํ•ด๋ณผ๊นŒ์š”?</p>

<p>์›น ์Šคํฌ๋ž˜ํ•‘์˜ ๊ฒฝ์šฐ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ๊ฐ€์žฅ ํฐ ๋ณ‘๋ชฉ ์ง€์ ์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ๋”ฐ๋ผ์„œ ๋™์‹œ์— ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ์Šคํฌ๋ž˜ํ•‘ํ•˜๋Š” ๋น„๋™๊ธฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, aiohttp์™€ asyncio๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์ฃ .</p>

<pre><code>import cProfile
import asyncio
import aiohttp
from bs4 import BeautifulSoup

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def scrape_titles_async():
    urls = ["https://news.ycombinator.com/", "https://news.ycombinator.com/news?p=2"]
    async with aiohttp.ClientSession() as session:
        html_contents = await asyncio.gather(*[fetch(session, url) for url in urls])
        
    titles = []
    for html in html_contents:
        soup = BeautifulSoup(html, 'html.parser')
        titles.extend([title.text for title in soup.find_all('a', class_='storylink')])
    return titles

def process_titles_async():
    titles = asyncio.run(scrape_titles_async())
    print(f"Number of titles scraped: {len(titles)}")

cProfile.run('process_titles_async()')

์ด ์ตœ์ ํ™”๋œ ๋ฒ„์ „์„ ์‹คํ–‰ํ•˜๋ฉด, ๋‘ ํŽ˜์ด์ง€๋ฅผ ๋™์‹œ์— ์Šคํฌ๋ž˜ํ•‘ํ•˜๋ฉด์„œ๋„ ์ „์ฒด ์‹คํ–‰ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ์ค„์–ด๋“  ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”. ๐Ÿ˜Š

๋งˆ๋ฌด๋ฆฌ: cProfile์˜ ํž˜

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” cProfile์„ ์‚ฌ์šฉํ•ด ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ตœ์ ํ™”ํ•ด๋ดค์–ด์š”. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ๊ณ„์‚ฐ, ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋น„๊ต, ์›น ์Šคํฌ๋ž˜ํ•‘๊นŒ์ง€! ์ด ๊ณผ์ •์„ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” cProfile์ด ์–ผ๋งˆ๋‚˜ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ธ์ง€ ํ™•์‹คํžˆ ์•Œ ์ˆ˜ ์žˆ์—ˆ์ฃ . ๐Ÿ˜Ž

cProfile์„ ์‚ฌ์šฉํ•˜๋ฉด:

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

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

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”! ์žฌ๋Šฅ๋„ท์—์„œ๋Š” ์ด๋Ÿฐ ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์„ ๋” ๊นŠ์ด ์žˆ๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋งŽ์•„์š”. cProfile ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท์˜ ์ „๋ฌธ๊ฐ€๋“ค์—๊ฒŒ ๋„์›€์„ ๋ฐ›์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”. ๐ŸŽ“

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ cProfile์˜ ์‚ฌ์šฉ๋ฒ•์„ ์™„์ „ํžˆ ๋งˆ์Šคํ„ฐํ–ˆ์–ด์š”! ๐Ÿ‘๐Ÿ‘๐Ÿ‘ ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜๊ณ  ์ตœ์ ํ™”ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋„ค์š”. ์–ด๋–ค ๋†€๋ผ์šด ์ตœ์ ํ™”๋ฅผ ์ด๋ค„๋‚ผ์ง€ ์ •๋ง ๊ธฐ๋Œ€๋ผ์š”! ํ™”์ดํŒ…! ๐Ÿ’ช๐Ÿ˜„

๐ŸŽฌ ๋งˆ๋ฌด๋ฆฌ: cProfile๋กœ ์ฝ”๋“œ ์ตœ์ ํ™”์˜ ๋‹ฌ์ธ๋˜๊ธฐ

์™€~ ์—ฌ๋Ÿฌ๋ถ„, ์ •๋ง ๋Œ€๋‹จํ•ด์š”! ๐Ÿ‘๐Ÿ‘๐Ÿ‘ ์ง€๊ธˆ๊นŒ์ง€ cProfile์˜ A๋ถ€ํ„ฐ Z๊นŒ์ง€ ํ•จ๊ป˜ ์‚ดํŽด๋ดค์–ด์š”. ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ cProfile์˜ ์ง„์ •ํ•œ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋˜์—ˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ˜Ž

์šฐ๋ฆฌ๊ฐ€ ํ•จ๊ป˜ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”?

  1. cProfile์ด ๋ญ”์ง€, ์™œ ํ•„์š”ํ•œ์ง€ ์•Œ์•„๋ดค์–ด์š”.
  2. cProfile์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์–ด์š”.
  3. ์‹ค์ œ ์ฝ”๋“œ์— cProfile์„ ์ ์šฉํ•ด๋ณด๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ•ด์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํ˜”์–ด์š”.
  4. ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์—ฐ์Šตํ–ˆ์–ด์š”.

์ด ๋ชจ๋“  ๊ณผ์ •์„ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ ์ตœ์ ํ™”์˜ ๋น„๋ฐ€์„ ๋ฐํ˜€๋ƒˆ์–ด์š”. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋น„๋ฐ€์˜ ์—ด์‡ ๊ฐ€ ๋ฐ”๋กœ cProfile์ด์—ˆ์ฃ ! ๐Ÿ—๏ธ

ํ•˜์ง€๋งŒ ๊ธฐ์–ตํ•˜์„ธ์š”. cProfile์€ ๋‹จ์ˆœํžˆ ๋„๊ตฌ์ผ ๋ฟ์ด์—์š”. ์ง„์งœ ์ค‘์š”ํ•œ ๊ฑด ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ถ„์„๋ ฅ๊ณผ ์ฐฝ์˜๋ ฅ์ด์—์š”. cProfile์ด ๋ณด์—ฌ์ฃผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์„ํ•˜๊ณ , ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ• ์ง€๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชซ์ด์—์š”. ๊ทธ๋ž˜์„œ ๊ณ„์†ํ•ด์„œ ์—ฐ์Šตํ•˜๊ณ  ๊ฒฝํ—˜์„ ์Œ“๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”. ๐Ÿง ๐Ÿ’ก

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”! ์ฝ”๋“œ ์ตœ์ ํ™”๋Š” ํ•ญ์ƒ '๋” ๋น ๋ฅด๊ฒŒ'๋งŒ์„ ์˜๋ฏธํ•˜๋Š” ๊ฑด ์•„๋‹ˆ์—์š”. ๋•Œ๋กœ๋Š” ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ ๋“ฑ๋„ ์ค‘์š”ํ•œ ์š”์†Œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด์š”. ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๊ท ํ˜•์„ ์ฐพ๋Š” ๊ฒƒ, ๊ทธ๊ฒŒ ๋ฐ”๋กœ ์ง„์ •ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ ฅ์ด์—์š”. ๐Ÿ˜‰

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

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ cProfile์˜ ๋‹ฌ์ธ์ด ๋˜์—ˆ์–ด์š”. ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋กœ ๋ฌด์žฅํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐœ์ „ํ• ์ง€ ์ •๋ง ๊ธฐ๋Œ€๋˜๋„ค์š”! ์•ž์œผ๋กœ๋„ ๊ณ„์†ํ•ด์„œ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ๋ฉ‹์ง„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธธ ๋ฐ”๋ผ์š”. ํ™”์ดํŒ…! ๐Ÿ’ช๐Ÿ˜„

๊ทธ๋Ÿผ ์ด์ œ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ cProfile๋กœ ๋ถ„์„ํ•˜๊ณ  ์ตœ์ ํ™”ํ•  ์‹œ๊ฐ„์ด์—์š”. ์–ด๋–ค ๋†€๋ผ์šด ๋ฐœ๊ฒฌ์„ ํ•˜๊ฒŒ ๋ ์ง€, ์–ด๋–ค ํš๊ธฐ์ ์ธ ๊ฐœ์„ ์„ ์ด๋ค„๋‚ผ์ง€ ์ •๋ง ๊ถ๊ธˆํ•˜๋„ค์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋”ฉ ์—ฌ์ •์— ํ–‰์šด์ด ํ•จ๊ป˜ํ•˜๊ธฐ๋ฅผ! ๐Ÿ€

๋‹ค์Œ์— ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ๋งŒ๋‚˜์š”. ์•ˆ๋…•ํžˆ ๊ณ„์„ธ์š”! ๐Ÿ‘‹๐Ÿ˜Š

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0