๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ Python

[Python] ํŒŒ์ด์ฌ ๊ฐœ๋ฐœ์ž ๋ฉด์ ‘ ์งˆ๋ฌธ

by dev.py 2024. 5. 26.

 

ํŒŒ์ด์ฌ ์ž๋ฃŒ๊ตฌ์กฐ ํŠน์ง•

ํŠน์ง• List Dictionary Set Tuple
์ˆœ์„œ ์œ ์ง€ O Python 3.7 ๋ถ€ํ„ฐ O X O
์ธ๋ฑ์‹ฑ O X X O
๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ O O O X
์ค‘๋ณต ํ—ˆ์šฉ O ํ‚ค๋Š” ์ค‘๋ณต ๋ถˆ๊ฐ€, ๊ฐ’์€ ๊ฐ€๋Šฅ X O
๋ฐ์ดํ„ฐ ์ˆœ์ฐจ ๋ฐ์ดํ„ฐ  ํ‚ค-๊ฐ’ ์Œ ๋ฐ์ดํ„ฐ  ๊ณ ์œ ํ•œ ์š”์†Œ ์ง‘ํ•ฉ ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ

 

 

GIL(Global Interpreter Lock)

  • Python ๋งค์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ → ํ•œ ๋ฒˆ์˜ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์‹คํ–‰๋จ
  • ๋ชฉ์ 
    • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ - ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ํ†ตํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ์ž‘๋™ํ•˜๋Š” ๋ฐ, ์ด ๋ถ€๋ถ„์ด race condition์— ์ทจ์•ฝํ•จ, ์ด๋ฅผ ํ•ด๊ฒฐ
    • ๊ฐ„์†Œํ™” - ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€
  • ์žฅ์ 
    • GIL๋กœ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์˜ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ → ๊ทธ๋ƒฅ ์Šค๋ ˆ๋“œ๋ฅผ ์ž ๊ถˆ๋ฒ„๋ฆผ
    • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€
  • ๋‹จ์ 
    • ๋ณ‘๋ ฌ์„ฑ ์ œํ•œ : ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋„ ์‹ค์ œ ๋™์‹œ์— ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ์— ์„ฑ๋Šฅ์ƒ ์ œ์•ฝ์ด ๋ฐœ์ƒ

 

 

๋น„๋™๊ธฐ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

asyncio ๊ธฐ๋ณธ ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๊ตฌํ˜„

import asyncio

async def async_function():
    print("Async function started")
    await asyncio.sleep(1)
    print("Async function finished")

asyncio.run(async_function())

 

 

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

ํ•จ์ˆ˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

def simple_decorator(func):
    def wrapper():
        print("Before function call")
        func()
        print("After function call")
    return wrapper

@simple_decorator
def my_function():
    print("This is my function")

my_function()

 

ํด๋ž˜์Šค ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

def class_decorator(cls):
    class WrappedClass(cls):
        def new_method(self):
            print("New method added")
    return WrappedClass

@class_decorator
class MyClass:
    def original_method(self):
        print("Original method")

obj = MyClass()
obj.original_method()
obj.new_method()

 

 

ํŒŒ์ด์ฌ์˜ ๋‹จ์ 

1. ์„ฑ๋Šฅ (Performance)

Python์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด๋กœ, ์ปดํŒŒ์ผ ์–ธ์–ด(C/C++, Java)๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Š” Python์ด ๋†’์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๋™์  ํƒ€์ดํ•‘(dynamic typing)๊ณผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(garbage collection) ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2. ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ (Memory Consumption)

Python์€ ๋†’์€ ์ˆ˜์ค€์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ๋™์  ํƒ€์ดํ•‘์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ž‘์—…์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ๋‚ฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์•ฝํ•œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์„ฑ๋Šฅ (Weak Multithreading Performance)

์•ž์„œ ์–ธ๊ธ‰ํ•œ GIL๋กœ ์ธํ•ด, Python์˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์€ CPU ๋ฐ”์šด๋“œ ์ž‘์—…์—์„œ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. I/O ๋ฐ”์šด๋“œ ์ž‘์—…์—์„œ๋Š” ๋น„๋™๊ธฐ I/O๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ์‚ฌ์šฉํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์—์„œ๋Š” ์„ฑ๋Šฅ์ƒ์˜ ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์‹คํ–‰ ํŒŒ์ผ ํฌ๊ธฐ (Executable Size)

Python์œผ๋กœ ์ž‘์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋…๋ฆฝ ์‹คํ–‰ ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง•ํ•  ๋•Œ, ์‹คํ–‰ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฐฐํฌ์™€ ์„ค์น˜๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ์ œ์•ฝ๋œ ๋Ÿฐํƒ€์ž„ ํƒ€์ž… ๊ฒ€์‚ฌ (Limited Runtime Type Checking)

Python์€ ๋™์  ํƒ€์ดํ•‘ ์–ธ์–ด๋กœ, ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ํƒ€์ž… ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์žก์•„๋‚ด๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํƒ€์ž… ํžŒํŒ…(type hinting)๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์ง€๋งŒ, ์ด๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์™„์ „ํžˆ ๋Œ€์ฒดํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. → Pydantic์œผ๋กœ ๊ทน๋ณต

 

 

Type hint์™€ Pydantic ์ฐจ์ด

ํŠน์ง• Type hint Pydantic
๋ชฉ์  ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ๋ฐ ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ๋ฐ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ
๊ฒ€์ฆ ์‹œ์  ์ •์  ๋ถ„์„ ๋„๊ตฌ/IDE์—์„œ ๊ฒ€์‚ฌ ๋Ÿฐํƒ€์ž„์—์„œ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋ฐ ๋ณ€ํ™˜
์‚ฌ์šฉ ์šฉ๋„ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜, ๋ณ€์ˆ˜ ํƒ€์ž… ๋ช…์‹œ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค ์ •์˜ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
์„ฑ๋Šฅ ์˜ํ–ฅ ๋Ÿฐํƒ€์ž„ ์˜ํ–ฅ ์—†์Œ ๋Ÿฐํƒ€์ž„์— ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ์ˆ˜ํ–‰์œผ๋กœ ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ ์ €ํ•˜
์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ •์  ๋ถ„์„ ๋‹จ๊ณ„์—์„œ ํƒ€์ž… ์˜ค๋ฅ˜ ๋ฐœ๊ฒฌ ๋Ÿฐํƒ€์ž„์—์„œ ValidationError ๋ฐœ์ƒ