๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™”: ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ๋ณ‘๋ชฉ ํ˜„์ƒ ํ•ด๊ฒฐ ๊ธฐ๋ฒ• ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™”: ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ๋ณ‘๋ชฉ ํ˜„์ƒ ํ•ด๊ฒฐ ๊ธฐ๋ฒ• ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํ•ซํ•œ ์ฃผ์ œ์ธ "์„ฑ๋Šฅ ์ตœ์ ํ™”"์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ํŠนํžˆ ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ๋ณ‘๋ชฉ ํ˜„์ƒ ํ•ด๊ฒฐ ๊ธฐ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑด๋ฐ, ์ด๊ฒŒ ์™œ ์ค‘์š”ํ•˜๋ƒ๊ณ ์š”? ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฑฐ๋ถ์ด์ฒ˜๋Ÿผ ๋Š๋ฆฟ๋Š๋ฆฟ ๋‹ฌ๋ฆฐ๋‹ค๋ฉด ๋ˆ„๊ฐ€ ์ข‹์•„ํ•˜๊ฒ ์–ด์š”? ใ…‹ใ…‹ใ…‹ ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ์น˜ํƒ€์ฒ˜๋Ÿผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”! ๐Ÿขโžก๏ธ๐Ÿ†

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

๊ทธ๋ฆฌ๊ณ  ์ž ๊น! ์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์žฌ๋Šฅ๋„ท์ด๋ผ๋Š” ์‚ฌ์ดํŠธ ์•„์„ธ์š”? ์—ฌ๊ธฐ์„œ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ด€๋ จ ์žฌ๋Šฅ์„ ๊ฑฐ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค! ๋‚˜์ค‘์— ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋‚ด์šฉ์œผ๋กœ ์‹ค๋ ฅ์„ ์Œ“์•„์„œ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋Šฅ๋ ฅ์„ ๋ฝ๋‚ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹๊ฒ ์ฃ ? ๐Ÿ˜Ž

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ๊ณ ๊ณ ์”ฝ~! ๐Ÿƒโ€โ™‚๏ธ๐Ÿ’จ

1. ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๋ญ๊ธธ๋ž˜? ๐Ÿค”

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

์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด์š”:

  • ์‹œ๊ฐ„ ๋ณต์žก๋„ ์ตœ์ ํ™”: ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๊ฑฐ์˜ˆ์š”.
  • ๊ณต๊ฐ„ ๋ณต์žก๋„ ์ตœ์ ํ™”: ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ค„์ด๋Š” ๊ฑฐ์ฃ .

์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์ž˜ ์กฐ์ ˆํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ๊ทธ๋žจ์€ ๋งˆ์น˜ ์Šˆํผ์นด์ฒ˜๋Ÿผ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋‹ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐ŸŽ๏ธ๐Ÿ’จ

๐Ÿ” ์•Œ์•„๋‘์„ธ์š”: ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ๋‹จ์ˆœํžˆ '๋น ๋ฅด๊ฒŒ' ๋งŒ๋“œ๋Š” ๊ฒƒ๋งŒ์ด ์•„๋‹ˆ์—์š”. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๊ฐœ์„ ํ•˜๊ณ , ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋น„์šฉ์„ ์ ˆ๊ฐํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ด์ ์ด ์žˆ๋‹ต๋‹ˆ๋‹ค!

๊ทธ๋Ÿผ ์ด์ œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ์™œ ์ค‘์š”ํ•œ์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ์š”? ๐Ÿง

1.1 ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ค‘์š”์„ฑ

์—ฌ๋Ÿฌ๋ถ„, ์ƒ์ƒํ•ด๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ๋“  ์•ฑ์ด ์—„์ฒญ ๋Š๋ฆฌ๋‹ค๊ณ  ํ•ด๋ด์š”. ์‚ฌ์šฉ์ž๋“ค์ด ๋ญ๋ผ๊ณ  ํ• ๊นŒ์š”? "์•„ ์ง„์งœ ๋‹ต๋‹ตํ•ด!" "์ด๊ฑฐ ์“ฐ์ง€ ๋ง์•„์•ผ๊ฒ ๋‹ค!" ์ด๋Ÿฐ ๋ง๋“ค์ด ๋“ค๋ฆฌ๊ฒ ์ฃ ? ใ…‹ใ…‹ใ…‹ ๊ทธ๋ž˜์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ์ •๋ง ์ค‘์š”ํ•ด์š”!

์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ค‘์š”์„ฑ์„ ๋ช‡ ๊ฐ€์ง€ ํฌ์ธํŠธ๋กœ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ์š”:

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

์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ๊นŒ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ์•„์‹œ๊ฒ ์ฃ ? ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ๋ณ‘๋ชฉ ํ˜„์ƒ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊นŒ์š”? ๐Ÿ˜Ž

2. ํ”„๋กœํŒŒ์ผ๋ง: ์ฝ”๋“œ์˜ ํƒ์ •๋†€์ด ๐Ÿ•ต๏ธโ€โ™‚๏ธ

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

2.1 ํ”„๋กœํŒŒ์ผ๋ง์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

ํ”„๋กœํŒŒ์ผ๋ง์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด์š”:

  • CPU ํ”„๋กœํŒŒ์ผ๋ง: ํ”„๋กœ๊ทธ๋žจ์˜ ์–ด๋Š ๋ถ€๋ถ„์ด CPU ์‹œ๊ฐ„์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ถ„์„ํ•ด์š”.
  • ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง: ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ถ„์„ํ•ด์š”.

์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ์—์„œ ์–ด๋Š ๋ถ€๋ถ„์ด ๋ฌธ์ œ์ธ์ง€ ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ‘€

๐Ÿ’ก ๊ฟ€ํŒ: ํ”„๋กœํŒŒ์ผ๋ง์€ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ•ด์ฃผ๋Š” ๊ฒŒ ์ข‹์•„์š”. ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์„ฑ๋Šฅ์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ๋Š”์ง€ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”!

2.2 ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ ์†Œ๊ฐœ

ํ”„๋กœํŒŒ์ผ๋ง์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋“ค์ด ์žˆ์–ด์š”. ๋ช‡ ๊ฐ€์ง€ ์œ ๋ช…ํ•œ ๋„๊ตฌ๋“ค์„ ์†Œ๊ฐœํ•ด๋“œ๋ฆด๊ฒŒ์š”:

  • Python: cProfile, line_profiler
  • Java: JProfiler, YourKit
  • JavaScript: Chrome DevTools, Node.js profiler
  • C/C++: Valgrind, gprof

์ด ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋งˆ์น˜ ํ˜„๋ฏธ๊ฒฝ์œผ๋กœ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž์„ธํžˆ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ˜Ž

2.3 ํ”„๋กœํŒŒ์ผ๋ง ์‹ค์Šต: Python cProfile ์‚ฌ์šฉํ•˜๊ธฐ

์ž, ์ด์ œ ์‹ค์ œ๋กœ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ•ด๋ณผ๊นŒ์š”? Python์˜ cProfile์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ถ„์„ํ•ด๋ณผ๊ฒŒ์š”.


import cProfile

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

def main():
    fibonacci(30)

cProfile.run('main()')

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


         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>)
2692537/1    0.839    0.000    0.839    0.839 <string>:4(fibonacci)
        1    0.000    0.000    0.839    0.839 <string>:8(main)
        1    0.000    0.000    0.839    0.839 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

์šฐ์™€! ์ด๊ฒŒ ๋ญ˜๊นŒ์š”? ๐Ÿ˜ฒ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”:

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

์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, fibonacci ํ•จ์ˆ˜๊ฐ€ ๋ฌด๋ ค 2,692,537๋ฒˆ์ด๋‚˜ ํ˜ธ์ถœ๋˜์—ˆ๊ณ , ์ด 0.839์ดˆ๊ฐ€ ๊ฑธ๋ ธ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Ÿฐ ์‹์œผ๋กœ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ•˜๋ฉด ์–ด๋Š ๋ถ€๋ถ„์ด ๋ณ‘๋ชฉ์ธ์ง€ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ‘

2.4 ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ ํ•ด์„ํ•˜๊ธฐ

ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด์„ํ•ด์•ผ ํ• ๊นŒ์š”? ๋ช‡ ๊ฐ€์ง€ ํŒ์„ ๋“œ๋ฆด๊ฒŒ์š”:

  1. ํ˜ธ์ถœ ํšŸ์ˆ˜๊ฐ€ ๋งŽ์€ ํ•จ์ˆ˜ ์ฒดํฌํ•˜๊ธฐ: ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์š”.
  2. ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ธด ํ•จ์ˆ˜ ์ฐพ๊ธฐ: ์ „์ฒด ์‹คํ–‰ ์‹œ๊ฐ„ ์ค‘ ํฐ ๋น„์ค‘์„ ์ฐจ์ง€ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฐพ์•„์š”.
  3. ์žฌ๊ท€ ํ•จ์ˆ˜ ์ฃผ์˜ํ•˜๊ธฐ: ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ ํšŸ์ˆ˜๊ฐ€ ๊ธ‰์ฆํ•  ์ˆ˜ ์žˆ์–ด์š”.
  4. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธํ•˜๊ธฐ: ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•ด์š”.

์ด๋ ‡๊ฒŒ ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ๋ฅผ ๊ผผ๊ผผํžˆ ๋ถ„์„ํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ์—์„œ ์–ด๋Š ๋ถ€๋ถ„์„ ๊ฐœ์„ ํ•ด์•ผ ํ• ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ˜Š

๐Ÿš€ ์„ฑ๋Šฅ ๊ฐœ์„  ํŒ: ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ์—์„œ ๊ฐ€์žฅ ์‹œ๊ฐ„์„ ๋งŽ์ด ์žก์•„๋จน๋Š” ์ƒ์œ„ 10~20% ํ•จ์ˆ˜๋“ค์— ์ง‘์ค‘ํ•˜์„ธ์š”. ์ด ๋ถ€๋ถ„๋“ค๋งŒ ๊ฐœ์„ ํ•ด๋„ ์ „์ฒด ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์–ด์š”!

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

3. ๋ณ‘๋ชฉ ํ˜„์ƒ: ์ฝ”๋“œ์˜ ๊ตํ†ต ์ฒด์ฆ ๐Ÿš—๐Ÿ’จ

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

3.1 ๋ณ‘๋ชฉ ํ˜„์ƒ์˜ ์ข…๋ฅ˜

๋ณ‘๋ชฉ ํ˜„์ƒ์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด์š”:

  • CPU ๋ณ‘๋ชฉ: CPU๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์˜ˆ์š”.
  • ๋ฉ”๋ชจ๋ฆฌ ๋ณ‘๋ชฉ: ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ๋น„ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์˜ˆ์š”.
  • I/O ๋ณ‘๋ชฉ: ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ํ”„๋กœ๊ทธ๋žจ์„ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ˆ์š”.

์ด ์ค‘์—์„œ ์–ด๋–ค ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”. ๊ทธ๋ž˜์•ผ ์˜ฌ๋ฐ”๋ฅธ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”! ๐Ÿ‘€

3.2 ๋Œ€ํ‘œ์ ์ธ ๋ณ‘๋ชฉ ํ˜„์ƒ๋“ค

์ž, ์ด์ œ ๋ช‡ ๊ฐ€์ง€ ๋Œ€ํ‘œ์ ์ธ ๋ณ‘๋ชฉ ํ˜„์ƒ๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ์š”? ๐Ÿง

  1. ๋น„ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜: O(n^2) ๋Œ€์‹  O(n log n) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ทธ๋Ÿฌ์ง€ ์•Š์€ ๊ฒฝ์šฐ
  2. ๊ณผ๋„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ: ํ•„์š” ์ด์ƒ์œผ๋กœ ํฐ ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ
  3. ๋ถˆํ•„์š”ํ•œ I/O ์ž‘์—…: ๋””์Šคํฌ๋‚˜ ๋„คํŠธ์›Œํฌ ์ž‘์—…์„ ๋„ˆ๋ฌด ์ž์ฃผ ํ•˜๋Š” ๊ฒฝ์šฐ
  4. ๋™๊ธฐํ™” ๋ฌธ์ œ: ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฝ(lock)์„ ๋„ˆ๋ฌด ์˜ค๋ž˜ ์žก๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ
  5. ์บ์‹œ ๋ฏธ์Šค: ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์บ์‹œ ์นœํ™”์ ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ

์ด๋Ÿฐ ๋ณ‘๋ชฉ๋“ค์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๊ดด๋กญํžˆ๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ˜ฑ

๐Ÿ’ก ์•Œ์•„๋‘์„ธ์š”: ๋ณ‘๋ชฉ ํ˜„์ƒ์€ ํ•ญ์ƒ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ณณ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋ž˜์„œ ํ”„๋กœํŒŒ์ผ๋ง์ด ์ •๋ง ์ค‘์š”ํ•œ ๊ฑฐ์ฃ !

3.3 ๋ณ‘๋ชฉ ํ˜„์ƒ ํ•ด๊ฒฐ ๊ธฐ๋ฒ•

์ž, ์ด์ œ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ์—ฌ๊ธฐ ๋ช‡ ๊ฐ€์ง€ ๊ฟ€ํŒ๋“ค์ด ์žˆ์–ด์š”! ๐Ÿฏ

3.3.1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์ ํ™”

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๋ฉด์„œ๋„ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์ด์—์š”. ๋” ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฑฐ์ฃ !


# ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ• (O(n^2))
def find_duplicate(arr):
    for i in range(len(arr)):
        for j in range(i+1, len(arr)):
            if arr[i] == arr[j]:
                return arr[i]
    return None

# ์ตœ์ ํ™”๋œ ๋ฐฉ๋ฒ• (O(n))
def find_duplicate_optimized(arr):
    seen = set()
    for num in arr:
        if num in seen:
            return num
        seen.add(num)
    return None

๋ณด์„ธ์š”, ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋Š”๋ฐ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ํ›จ์”ฌ ๋น ๋ฅด์ฃ ? ์ด๋ ‡๊ฒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์—„์ฒญ๋‚œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ‘

3.3.2 ์บ์‹ฑ ํ™œ์šฉํ•˜๊ธฐ

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์บ์‹œ์— ์ €์žฅํ•ด๋‘๋ฉด ์ข‹์•„์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋งค๋ฒˆ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋นจ๋ผ์ ธ์š”!


import functools

@functools.lru_cache(maxsize=None)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# ์ด์ œ fibonacci(100)์„ ํ˜ธ์ถœํ•ด๋„ ์—„์ฒญ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐ๋ผ์š”!

์ด ์ฝ”๋“œ์—์„œ @functools.lru_cache๋Š” ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•ด์ฃผ๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ˆ์š”. ๋•๋ถ„์— ๊ฐ™์€ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•ด๋„ ๋น ๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ‘€

3.3.3 ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ํ™œ์šฉํ•˜๊ธฐ

์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋ฉด ์ „์ฒด์ ์ธ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์–ด์š”. Python์˜ multiprocessing ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด๋ณผ๊นŒ์š”?


from multiprocessing import Pool

def process_item(item):
    # ์—ฌ๊ธฐ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ๋„ฃ์–ด์š”
    return item * item

if __name__ == '__main__':
    items = list(range(1000000))
    
    with Pool() as p:
        result = p.map(process_item, items)
    
    print("Done!")

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ CPU ์ฝ”์–ด๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•ด์„œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ์—„์ฒญ ๋นจ๋ผ์ง€๊ฒ ์ฃ ? ๐Ÿš€

3.3.4 ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ตœ์ ํ™”

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ํฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์•„์š”.


# ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
def get_squares(n):
    return [i*i for i in range(n)]

# ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
def get_squares_generator(n):
    for i in range(n):
        yield i*i

# ์‚ฌ์šฉ ์˜ˆ
for square in get_squares_generator(1000000):
    # ์—ฌ๊ธฐ์„œ ๋ญ”๊ฐ€๋ฅผ ํ•ด์š”
    pass

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

3.3.5 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ์ตœ์ ํ™”

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ฟผ๋ฆฌ ์ตœ์ ํ™”๋„ ์ค‘์š”ํ•ด์š”. ์ธ๋ฑ์Šค๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ์กฐ์ธ์„ ์ค„์ด๋Š” ๊ฒŒ ์ข‹์•„์š”.


# ๋น„ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ
SELECT * FROM users WHERE name LIKE '%John%'

# ์ตœ์ ํ™”๋œ ์ฟผ๋ฆฌ
SELECT * FROM users WHERE name_index LIKE 'John%'

์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•ด์•ผ ํ•˜์ง€๋งŒ, ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•ด ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์—„์ฒญ๋‚œ ์ฐจ์ด์ฃ ? ๐Ÿ˜Ž

๐Ÿš€ ์„ฑ๋Šฅ ๊ฐœ์„  ํŒ: ํ•ญ์ƒ "์ž‘์€ ๊ฐœ์„ ์ด๋ผ๋„ ๊ดœ์ฐฎ์•„"๋ผ๋Š” ๋งˆ์ธ๋“œ๋ฅผ ๊ฐ€์ง€์„ธ์š”. ์ž‘์€ ์ตœ์ ํ™”๋“ค์ด ๋ชจ์—ฌ์„œ ํฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์–ด์š”!

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ๋ณ‘๋ชฉ ํ˜„์ƒ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ธฐ๋ฒ•๋“ค์„ ์•Œ์•„๋ดค์–ด์š”. ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„๋„ ์ฝ”๋“œ์˜ ๊ตํ†ต ์ฒด์ฆ์„ ์‹œ์›ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿš—๐Ÿ’จ

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

4. ์‹ค์ „ ์ตœ์ ํ™”: ์ด๋ก ์„ ํ˜„์‹ค๋กœ! ๐Ÿ’ช

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณผ ์‹œ๊ฐ„์ด์—์š”! ๐ŸŽ‰ ์ด๋ก ๋งŒ ์•Œ๋ฉด ๋ญํ•ด์š”, ์‹ค์ „์—์„œ ์จ๋จน์–ด์•ผ์ฃ ! ใ…‹ใ…‹ใ…‹

4.1 ์ตœ์ ํ™” ํ”„๋กœ์„ธ์Šค

์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ํ•œ ๋ฒˆ์— ๋๋‚˜๋Š” ๊ฒŒ ์•„๋‹ˆ์—์š”. ์ง€์†์ ์ธ ๊ณผ์ •์ด์ฃ . ์—ฌ๊ธฐ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์†Œ๊ฐœํ• ๊ฒŒ์š”:

  1. ์ธก์ •ํ•˜๊ธฐ: ํ˜„์žฌ ์„ฑ๋Šฅ์„ ์ •ํ™•ํžˆ ์ธก์ •ํ•ด์š”.
  2. ๋ถ„์„ํ•˜๊ธฐ: ๋ณ‘๋ชฉ ์ง€์ ์„ ์ฐพ์•„๋‚ด์š”.
  3. ์ตœ์ ํ™”ํ•˜๊ธฐ: ๋ณ‘๋ชฉ์„ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•ด์š”.
  4. ๊ฒ€์ฆํ•˜๊ธฐ: ์ตœ์ ํ™” ํ›„์˜ ์„ฑ๋Šฅ์„ ๋‹ค์‹œ ์ธก์ •ํ•ด์š”.
  5. ๋ฐ˜๋ณตํ•˜๊ธฐ: ์ด ๊ณผ์ •์„ ๊ณ„์† ๋ฐ˜๋ณตํ•ด์š”.

์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ๊ทธ๋žจ์€ ์ ์  ๋” ๋นจ๋ผ์งˆ ๊ฑฐ์˜ˆ์š”! ๐Ÿš€

4.2 ์‹ค์ œ ํ”„๋กœ์ ํŠธ ์ตœ์ ํ™” ์˜ˆ์‹œ

์ž, ์ด์ œ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ์š”. ๊ฐ€์ƒ์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ตœ์ ํ™”ํ•ด๋ณด์ฃ !

4.2.1 ์ดˆ๊ธฐ ์ƒํƒœ

์šฐ๋ฆฌ์˜ ์›น ์•ฑ์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์ด ๋„ˆ๋ฌด ๋Š๋ ค์š”. ๐Ÿ˜ข


# app.py

@app.route('/user/<user_id>')
def user_profile(user_id):
    user = get_user(user_id)
    posts = get_user_posts(user_id)
    friends = get_user_friends(user_id)
    return render_template('profile.html',  user=user, posts=posts, friends=friends)

def get_user(user_id):
    return db.query(User).filter_by(id=user_id).first()

def get_user_posts(user_id):
    return db.query(Post).filter_by(user_id=user_id).all()

def get_user_friends(user_id):
    return db.query(Friend).filter_by(user_id=user_id).all()
</user_id>

์ด ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ ์ด ๋ณด์ด์‹œ๋‚˜์š”? ๊ฐ ํ•จ์ˆ˜๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์–ด์š”. ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•  ๋•Œ๋งˆ๋‹ค 3๋ฒˆ์˜ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฑฐ์ฃ ! ๐Ÿ˜ฑ

4.2.2 ํ”„๋กœํŒŒ์ผ๋ง

๋จผ์ € ์ด ํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•ด๋ณผ๊ฒŒ์š”. Flask-Profiler๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ•ด๋ด…์‹œ๋‹ค.


from flask_profiler import Profiler

profiler = Profiler(app)
profiler.init_app(app)

ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ, get_user_posts์™€ get_user_friends ํ•จ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ์•˜์–ด์š”.

4.2.3 ์ตœ์ ํ™”

์ž, ์ด์ œ ์ตœ์ ํ™”๋ฅผ ํ•ด๋ณผ๊นŒ์š”? ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”.

  1. ์ฟผ๋ฆฌ ์ตœ์ ํ™”: ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ๋ด์š”.
  2. ์บ์‹ฑ ๋„์ž…: ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋Š” ์บ์‹œ์— ์ €์žฅํ•ด์š”.
  3. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ: ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋“œํ•ด์š”.

์ตœ์ ํ™”๋œ ์ฝ”๋“œ๋ฅผ ๋ณผ๊นŒ์š”?


from flask_caching import Cache
cache = Cache(app, config={'CACHE_TYPE': 'simple'})

@app.route('/user/<user_id>')
def user_profile(user_id):
    user, posts, friends = get_user_data(user_id)
    return render_template('profile.html', user=user, posts=posts, friends=friends)

@cache.memoize(timeout=300)  # 5๋ถ„๊ฐ„ ์บ์‹œ
def get_user_data(user_id):
    user = db.query(User).filter_by(id=user_id).first()
    posts = db.query(Post).filter_by(user_id=user_id).limit(10).all()  # ์ตœ๊ทผ 10๊ฐœ๋งŒ ๊ฐ€์ ธ์™€์š”
    friends = db.query(Friend).filter_by(user_id=user_id).limit(20).all()  # ์นœ๊ตฌ 20๋ช…๋งŒ ๊ฐ€์ ธ์™€์š”
    return user, posts, friends

# ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋น„๋™๊ธฐ๋กœ ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์–ด์š”
@app.route('/api/user/<user_id>/posts')
def get_more_posts(user_id):
    page = request.args.get('page', 1, type=int)
    posts = db.query(Post).filter_by(user_id=user_id).offset((page-1)*10).limit(10).all()
    return jsonify([post.to_dict() for post in posts])
</user_id></user_id>

์™€์šฐ! ์ด๋ ‡๊ฒŒ ์ตœ์ ํ™”ํ•˜๋‹ˆ๊นŒ ์–ด๋–ค๊ฐ€์š”? ๐Ÿ˜Ž

  • ์ฟผ๋ฆฌ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ˜ธ์ถœ ํšŸ์ˆ˜๋ฅผ ์ค„์˜€์–ด์š”.
  • ์บ์‹ฑ์„ ๋„์ž…ํ•ด์„œ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด์š”.
  • ์ดˆ๊ธฐ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ณ , ๋‚˜๋จธ์ง€๋Š” ๋น„๋™๊ธฐ๋กœ ๋กœ๋“œํ•ด์š”.

4.2.4 ๊ฒฐ๊ณผ ๊ฒ€์ฆ

์ด์ œ ๋‹ค์‹œ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ•ด๋ณด๋ฉด, ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ์ค„์–ด๋“  ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๐Ÿš€

๐ŸŽ‰ ์ถ•ํ•˜ํ•ด์š”! ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฐฉ๊ธˆ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ–ˆ์–ด์š”! ์ด๋Ÿฐ ์‹์œผ๋กœ ์กฐ๊ธˆ์”ฉ ๊ฐœ์„ ํ•ด ๋‚˜๊ฐ€๋ฉด, ๊ฒฐ๊ตญ์—” ์•„์ฃผ ๋น ๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

4.3 ์ตœ์ ํ™” ์‹œ ์ฃผ์˜์‚ฌํ•ญ

ํ•˜์ง€๋งŒ ์ž ๊น! ์ตœ์ ํ™”ํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๋“ค๋„ ์žˆ์–ด์š”. ๐Ÿ‘€

  1. ๋„ˆ๋ฌด ์ด๋ฅธ ์ตœ์ ํ™”๋Š” ๊ธˆ๋ฌผ: ์ •๋ง ํ•„์š”ํ•œ ๊ณณ์—๋งŒ ์ตœ์ ํ™”๋ฅผ ํ•ด์š”.
  2. ๊ฐ€๋…์„ฑ vs ์„ฑ๋Šฅ: ๋•Œ๋กœ๋Š” ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ์„ ํฌ๊ธฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ์„ ํƒํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.
  3. ํ…Œ์ŠคํŠธ ์ค‘์š”์„ฑ: ์ตœ์ ํ™” ํ›„์—๋„ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ผญ ํ…Œ์ŠคํŠธํ•ด์š”.
  4. ๋ฌธ์„œํ™”: ์™œ ์ด๋ ‡๊ฒŒ ์ตœ์ ํ™”ํ–ˆ๋Š”์ง€ ์ฃผ์„์ด๋‚˜ ๋ฌธ์„œ๋กœ ๋‚จ๊ฒจ๋‘์„ธ์š”.

์ด๋Ÿฐ ์ ๋“ค์„ ์ž˜ ๊ธฐ์–ตํ•˜๋ฉด์„œ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด, ๋” ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ’ช

5. ๋งˆ๋ฌด๋ฆฌ: ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ! ๐ŸŽ๏ธ๐Ÿ’จ

์ž, ์—ฌ๋Ÿฌ๋ถ„! ๊ธด ์—ฌ์ •์ด์—ˆ์ง€๋งŒ ์ •๋ง ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์› ์ฃ ? ๐Ÿ‘ ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋œ ๊ฑฐ์˜ˆ์š”! ๐ŸŽ“

5.1 ๋ฐฐ์šด ๋‚ด์šฉ ์ •๋ฆฌ

์šฐ๋ฆฌ๊ฐ€ ์˜ค๋Š˜ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ์š”:

  • ํ”„๋กœํŒŒ์ผ๋ง: ์ฝ”๋“œ์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๋ณ‘๋ชฉ ํ˜„์ƒ: ํ”„๋กœ๊ทธ๋žจ์˜ ์ „์ฒด ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ๋ถ€๋ถ„
  • ์ตœ์ ํ™” ๊ธฐ๋ฒ•: ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ์„ , ์บ์‹ฑ, ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋“ฑ
  • ์‹ค์ „ ์ตœ์ ํ™”: ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

5.2 ์•ž์œผ๋กœ์˜ ํ•™์Šต ๋ฐฉํ–ฅ

์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ์ •๋ง ๋„“๊ณ  ๊นŠ์€ ์ฃผ์ œ์˜ˆ์š”. ์—ฌ๊ธฐ์„œ ๋ฉˆ์ถ”์ง€ ๋ง๊ณ  ๊ณ„์† ๊ณต๋ถ€ํ•ด ๋‚˜๊ฐ€์„ธ์š”! ๐Ÿ‘จโ€๐ŸŽ“๐Ÿ‘ฉโ€๐ŸŽ“

  1. ๋‹ค์–‘ํ•œ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ ๊ณต๋ถ€ํ•˜๊ธฐ: ๊ฐ ์–ธ์–ด๋งˆ๋‹ค ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด ๋‹ค๋ฅด๋‹ต๋‹ˆ๋‹ค.
  2. ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ์ดํ•ดํ•˜๊ธฐ: ์ „์ฒด ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋ฉด ๋” ํšจ๊ณผ์ ์ธ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด์š”.
  3. ์ตœ์‹  ํŠธ๋ Œ๋“œ ๋”ฐ๋ผ๊ฐ€๊ธฐ: ์ƒˆ๋กœ์šด ์ตœ์ ํ™” ๊ธฐ๋ฒ•๊ณผ ๋„๊ตฌ๋“ค์ด ๊ณ„์† ๋‚˜์˜ค๊ณ  ์žˆ์–ด์š”.
  4. ์‹ค์ „ ๊ฒฝํ—˜ ์Œ“๊ธฐ: ์ด๋ก ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•ด์š”. ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด์„ธ์š”!

5.3 ๋งˆ์ง€๋ง‰ ์กฐ์–ธ

์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ๋งˆ๋ฒ•์ด ์•„๋‹ˆ์—์š”. ๊พธ์ค€ํ•œ ๋…ธ๋ ฅ๊ณผ ์—ฐ์Šต์ด ํ•„์š”ํ•˜์ฃ . ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๋ ‡๊ฒŒ ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์œผ๋‹ˆ, ๋ถ„๋ช… ๋ฉ‹์ง„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋  ๊ฑฐ์˜ˆ์š”! ๐Ÿ’ช๐Ÿ˜Š

๐ŸŒŸ ๊ธฐ์–ตํ•˜์„ธ์š”: "Rome wasn't built in a day." ๋กœ๋งˆ๋Š” ํ•˜๋ฃจ์•„์นจ์— ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•˜์–ด์š”. ์„ฑ๋Šฅ ์ตœ์ ํ™”๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ˆ์š”. ์กฐ๊ธˆ์”ฉ, ๊พธ์ค€ํžˆ ๊ฐœ์„ ํ•ด ๋‚˜๊ฐ€์„ธ์š”!

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