Python 생성기 및 수율 설명: 실제 예제로 메모리 절약

  1. 홈
  2. 블로그
  3. 소프트웨어 개발

소프트웨어 개발

Python 생성기 및 수율 설명: 실제 예제로 메모리 절약

생성기는 메모리에 전체 목록을 작성하는 대신 한 번에 하나씩 값을 생성합니다. Yield가 어떻게 기능을 일시 중지하는지 정확히 살펴보고, 측정한 메모리 차이를 확인하고, 작은 데이터 파이프라인을 구축하세요.

읽는 시간 9분
Python 생성기 및 수율 설명: 실제 예제로 메모리 절약

핵심 요약

  • yield을 포함하는 함수는 생성기를 반환하며 해당 본문은 값을 요청할 때까지 실행되지 않습니다.
  • yield은 기능을 일시 중지하고 다음 요청까지 로컬 상태를 유지합니다.
  • 생성기는 작고 고정된 양의 메모리를 사용하지만 생성되는 값은 많습니다.
  • 발전기는 한 번만 소모될 수 있는데, 이는 가장 일반적인 함정입니다.

단지 오류를 찾기 위해 10GB 로그 파일을 목록에 로드한다고 상상해 보십시오. 프로그램에서 메모리를 찾기 전에 메모리가 부족할 수 있습니다. Python 생성기는 요청에 따라 한 번에 하나씩 값을 생성하여 이 문제를 해결하므로 거의 메모리 없이 거대하거나 끝없는 데이터를 처리할 수 있습니다.

이 가이드는 발전기가 실행될 때 실제로 어떤 일이 발생하는지 단계별로 보여줍니다. Python 3.13에서 각 예제를 실행했으며 해당 실행에서 출력이 나왔습니다. 초보자를 위한 Python 튜토리얼에서 다루는 함수와 루프에 이미 익숙해지면 도움이 됩니다.

발전기 란 무엇입니까?

생성기는 yield을 사용하여 함수를 작성하여 생성하는 특별한 종류의 반복기입니다. yield가 포함된 함수는 자동으로 생성기 함수가 되며, 이를 호출하면 코드를 실행하는 대신 생성기 개체가 제공됩니다.

def count_up(limit):
    print("starting")
    n = 1
    while n <= limit:
        yield n
        n += 1
    print("finished")

gen = count_up(2)
print(gen)

# <generator object count_up at 0x...>

“시작”이 인쇄되지 않았습니다. 함수를 호출하면 생성기만 생성됩니다. 내부에는 아직 아무것도 실행되지 않았습니다.

수율 작동 방식(단계별)

next()에 대한 각 호출은 yield에 도달할 때까지 함수를 실행하고 해당 값을 반환한 다음 제자리에 고정됩니다. 다음 호출은 모든 지역 변수가 그대로 유지된 채 해당 줄 바로 뒤에서 재개됩니다.

print(next(gen))
# starting
# 1

print(next(gen))
# 2

next(gen)
# finished
# StopIteration

출력을 주의 깊게 따르십시오. “시작”은 첫 번째 next()에만 나타납니다. 두 번째에서는 실행이 중지된 곳부터 계속되므로 n는 여전히 사용 가능하며 2가 됩니다. 세 번째에서는 루프가 끝나고 “finished”가 인쇄되고 함수가 끝에서 떨어지며 Python은 StopIteration을 발생시켜 아무것도 남지 않았다는 신호를 보냅니다.

next() 자신에게 전화하는 경우는 거의 없습니다. for 루프가 이 작업을 수행하고 StopIteration을 조용히 처리합니다. list(), sum() 및 유사한 기능도 마찬가지입니다.

print(list(count_up(3)))

# starting
# finished
# [1, 2, 3]

수익률 대 수익률

측면 반환 수확량
기능 기능을 종료합니다 기능을 일시 중지합니다.
생산된 가치 결과 1개 시리즈, 한 번에 하나씩
지역 주 폐기됨 값 사이에 보존됨
코드가 실행될 때 부르면 바로 값이 요청된 경우에만
많은 값을 위한 메모리 모두 잡아야 해 한 번에 하나씩 보유

이러한 지연을 지연 평가라고 합니다. 값은 필요할 때만 계산됩니다. 생성기 내부의 일반 return는 생성기를 종료하고 StopIteration을 트리거합니다.

측정된 메모리 차이

우리는 sys.getsizeof을 사용하여 백만 개의 정사각형 목록을 등가 생성기와 비교했습니다.

import sys

squares_list = [n * n for n in range(1_000_000)]
squares_gen = (n * n for n in range(1_000_000))

print(sys.getsizeof(squares_list), sys.getsizeof(squares_gen))

# 8448728 200

목록의 자체 구조는 약 8.4MB를 차지한 반면 생성기는 우리 시스템에서 200바이트만 차지했습니다. getsizeof은 목록 내부의 정수 개체를 계산하지 않기 때문에 실제 차이는 훨씬 더 큽니다. 또한 생성기의 크기는 결과가 아닌 현재 상태만 저장하므로 10억 개의 항목에 대해 동일하게 유지됩니다.

그러나 절충안이 있습니다. 목록은 len()을 사용하여 재사용, 색인화 및 측정할 수 있습니다. 발전기는 이들 중 어느 것도 제공하지 않습니다. 무작위 액세스가 필요하거나 소량의 데이터에 대해 여러 번 반복하는 경우 목록이 더 간단합니다. 이러한 유형에 대한 자세한 내용은 Python 목록 대 튜플 대 집합 가이드를 참조하세요.

생성기 표현식

간단한 경우에는 함수가 필요하지 않습니다. 생성기 표현식은 사각형 대신 둥근 괄호가 있는 목록 이해와 같습니다.

squares = [n * n for n in range(5)]   # builds a list now
squares = (n * n for n in range(5))   # produces values on demand

print(sum(n * n for n in range(5)))

# 30

sum()과 같이 생성기 표현식이 함수에 대한 유일한 인수인 경우 추가 대괄호를 생략할 수 있습니다. 임시 목록이 생성되지 않으므로 이는 대용량 데이터에 대한 합계를 정리하는 습관입니다.

데이터 파이프라인 구축

발전기가 실제로 빛나는 곳은 바로 여기입니다. 각 항목이 한 번에 하나씩 모든 단계를 통과하도록 소형 생성기를 연결할 수 있습니다.

def read_lines(lines):
    for line in lines:
        yield line.strip()

def only_errors(lines):
    for line in lines:
        if line.startswith("ERROR"):
            yield line

def messages(lines):
    for line in lines:
        yield line.split(" ", 1)[1]

log = ["INFO started\n", "ERROR db down\n",
       "ERROR disk full\n", "INFO stopped\n"]

print(list(messages(only_errors(read_lines(log)))))

# ['db down', 'disk full']

각 단계는 하나의 작은 작업을 수행하며 자체적으로 테스트할 수 있습니다. 실제 사용에서는 Python 파일 처리에 대한 가이드에서 볼 수 있듯이 파일 객체를 한 줄씩 읽을 수 있으므로 열린 파일에 대한 샘플 목록을 교환하세요. 그러면 수 기가바이트의 로그라도 아주 적은 메모리로 통과됩니다.

팁: 파이프라인은 무언가가 그것을 소비할 때까지 작동하지 않습니다. 체인 구축은 즉각적입니다. 처리는 최종 생성기를 반복하거나 list()와 같은 호출로 래핑할 때만 발생합니다.

무한 시퀀스

목록은 무한할 수 없지만 생성기는 다음 값만 계산하므로 무한할 수 있습니다. 필요한 만큼 가져오려면 itertools.islice을 사용하세요.

import itertools

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

print(list(itertools.islice(fibonacci(), 8)))

# [0, 1, 1, 2, 3, 5, 8, 13]

하지만 주의하세요. 제한 없이 list(fibonacci())을 호출하면 메모리가 사라질 때까지 실행됩니다. 동일한 패턴은 현재 페이지가 소진될 때만 다음 페이지를 가져오는 ID 생성기, 폴링 루프 및 페이지 매김 API 결과에 적합합니다.

생산량 및 배치

yield from 다른 반복 가능 항목에 손을 대고 중첩 루프를 저장합니다.

def chain_all(*groups):
    for group in groups:
        yield from group

print(list(chain_all([1, 2], (3, 4))))

# [1, 2, 3, 4]

매우 실용적인 패턴은 데이터를 고정된 크기의 배치로 분할하는 것입니다. 예를 들어 한 번에 수천 개의 행을 데이터베이스에 삽입하는 것입니다.

def batches(items, size):
    batch = []
    for item in items:
        batch.append(item)
        if len(batch) == size:
            yield batch
            batch = []
    if batch:
        yield batch

print(list(batches(range(7), 3)))

# [[0, 1, 2], [3, 4, 5], [6]]

마지막 if batch은 더 작은 남은 그룹이 손실되지 않도록 합니다. Python 3.12 이상에는 비슷한 작업을 수행하는 itertools.batched도 포함되어 있습니다.

보내기, 닫기 및 정리

생성자는 값을 받을 수도 있습니다. send()은 생성기를 다시 시작하고 값은 yield 표현식의 결과가 됩니다. 첫 번째 yield에 도달하려면 먼저 next()을 한 번 호출해야 합니다.

def running_total():
    total = 0
    while True:
        value = yield total
        total += value

t = running_total()
next(t)
print(t.send(10), t.send(5))

# 10 15

대부분의 사람들은 이것이 거의 필요하지 않습니다. 더 일반적인 관심사는 청소입니다. 일찍 중지하면 발전기가 닫혀도 finally 블록이 계속 실행됩니다.

def tracked():
    try:
        yield 1
        yield 2
    finally:
        print("cleanup ran")

tr = tracked()
next(tr)
tr.close()

# cleanup ran

Pytest는 바로 이 아이디어를 사용합니다. pytest 튜토리얼에서 보여주듯이 yield이 있는 픽스처는 나중에 정리를 실행합니다. 마찬가지로 표준 라이브러리의 contextmanager 데코레이터는 생성기를 with 블록으로 바꿉니다.

클래스의 생성기

__iter__ 메서드를 생성기로 작성하는 것은 자신의 클래스를 반복 가능하게 만드는 가장 쉬운 방법입니다. 보너스는 각 루프가 새로운 생성기를 가져오므로 객체를 계속해서 반복할 수 있다는 것입니다.

class Countdown:
    def __init__(self, start):
        self.start = start

    def __iter__(self):
        n = self.start
        while n > 0:
            yield n
            n -= 1

c = Countdown(3)
print(list(c), list(c))

# [3, 2, 1] [3, 2, 1]

발전기를 사용해야 하는 경우

다음과 같은 경우에는 발전기를 사용하십시오. 다음과 같은 경우 목록을 사용하세요.
데이터가 크거나 크기를 알 수 없습니다. 데이터가 작고 메모리에 적합합니다.
항목을 순서대로 한 번 처리합니다. 여러 번 반복합니다.
일찍 그만둬도 된다 len(), 인덱싱 또는 슬라이싱이 필요합니다.
스트림이나 파일을 읽고 있습니다. 데이터를 정렬하거나 반전해야 합니다.
파이프라인을 구축하고 있습니다. 기억력보다 단순함이 더 중요하다

발전기가 전체적으로 항상 더 빠른 것은 아닙니다. 모든 값을 사용하게 되면 전체 작업은 비슷하며, 항목당 오버헤드가 적기 때문에 작은 데이터의 경우 목록 이해가 더 빨라질 수도 있습니다. 주요 이점은 메모리 사용과 첫 번째 결과를 더 빨리 얻을 수 있다는 것입니다.

일반적인 실수

노후된 발전기 재사용

이것은 어느 시점에서 거의 모든 사람을 붙잡습니다. 생성기는 완료되었음을 기억합니다.

g = count_up(2)
print(list(g), list(g))

# [1, 2] []

두 번째 호출에서는 오류가 전혀 없는 빈 목록을 가져옵니다. 함수를 다시 호출하여 새 생성기를 얻거나 위에 표시된 클래스 접근 방식을 사용하세요.

코드가 즉시 실행될 것으로 예상

def noisy():
    print("body runs")
    yield 1

n = noisy()        # nothing is printed
print(next(n))     # body runs, then 1

생성기 상단의 인수 검사는 첫 번째 next()까지 실행되지 않으므로 오류를 발생시킨 호출과는 거리가 먼 곳에 오류가 나타날 수 있습니다.

기타 함정

  • len() 호출 또는 인덱싱. 생성기는 둘 다 지원하지 않으며 TypeError을 발생시킵니다.
  • 파일을 너무 빨리 닫습니다. with 블록 내부에서 생성기를 반환하면 줄을 읽기 전에 파일이 닫힐 수 있습니다. with 블록 안에 yield을 넣으세요.
  • 모든 것을 list()로 포장합니다. 그러면 메모리 이점이 사라집니다.
  • 작은 데이터에 하나를 사용합니다. 일반 목록이 더 명확한 경우가 많습니다.

마무리

제너레이터는 일시정지할 수 있는 함수입니다. 그 하나의 아이디어는 낮은 메모리 사용, 끝없는 시퀀스 및 깔끔한 파이프라인을 제공합니다. 이를 실제로 적용하려면 코드에서 한 번만 반복하기 위해 큰 목록을 작성하고 이를 생성기로 바꾸는 위치를 찾으십시오. 그런 다음 실제 로그 파일에 두 개의 작은 생성기를 함께 연결해 보십시오.

자주 묻는 질문

Python에서 Yield는 무엇을 합니까?

Yield는 값을 생성하고 지역 변수를 유지하면서 함수를 일시 중지합니다. 다음 값이 요청되면 동일한 지점에서 함수가 다시 시작됩니다.

생성기와 목록의 차이점은 무엇입니까?

목록은 모든 값을 한 번에 메모리에 저장합니다. 생성기는 요청 시 각 값을 계산하고 메모리를 거의 사용하지 않으며 일반적으로 한 번만 사용할 수 있습니다.

반복자와 생성자의 차이점은 무엇입니까?

모든 생성기는 반복자입니다. Python이 __iter__ 및 __next__ 메서드를 생성하므로 생성기는 생성기를 작성하는 가장 쉬운 방법입니다.

발전기를 두 번 반복할 수 있습니까?

아니요. 일단 소진되면 오류가 발생하지 않고 더 이상 아무것도 생성하지 않습니다. 함수를 다시 호출하여 새 생성기를 생성하거나 결과를 목록에 저장하세요.

생성기가 목록보다 빠른가요?

항상 그런 것은 아닙니다. 훨씬 적은 양의 메모리를 사용하고 첫 번째 결과를 더 빨리 제공하지만, 적은 양의 데이터를 완전히 소비하면 목록 이해가 약간 더 빨라질 수 있습니다.

계속 학습하세요

Stack Quora와 작업

테스트, WordPress 또는 SEO에 도움이 필요하십니까?

우리는 팀이 더 나은 소프트웨어를 출시하고 사이트를 성장시킬 수 있도록 돕습니다. 현재 진행 중인 작업을 알려주시면 명확한 다음 단계를 제안해 드리겠습니다.

계속 읽으세요

추가 가이드 테스트, AI 및 최신 개발

이 기사가 마음에 드셨나요? 주제를 선택하고 최신 튜토리얼로 바로 이동하세요.

인공지능

AI 환각 설명: 언어 모델이 사물을 구성하는 이유와 이를 줄이는 방법

AI 환각은 그것이 무엇인지, 언어 모델이 환각을 생성하는 이유, 일반적인 유형, 접지 및 프롬프트를 통해 환각을 줄이는 방법, 그리고 우리가 실행한 간단한 점검에 대해 설명했습니다.

기사 읽기 →
DevOps

환경 변수 설명: .env 파일, 비밀 및 구성이 올바르게 완료되었습니다.

우리가 실행한 Python 예제를 통해 설명된 환경 변수: 읽기 및 설정, 모든 값이 문자열인 이유, .env 파일, 프로세스 상속, 비밀 및 유효성 검사.

기사 읽기 →
소프트웨어 개발

API 속도 제한 설명: 알고리즘, 헤더 및 429 오류 처리

우리가 실행한 시뮬레이션을 통해 설명된 API 속도 제한: 토큰 버킷, 고정 창, 슬라이딩 창, 429 응답, 속도 제한 헤더, 백오프를 사용한 재시도 및 테스트 제한.

기사 읽기 →
테스트 자동화

Python에서 조롱: unittest.mock, 패치 및 테스트를 거짓말로 만드는 실수

Unittest.mock을 사용하여 Python에서 모의, 테스트됨: 모의 및 return_value, 부작용, 이름이 사용되는 패치, 사양 및 자동 사양, 모의 날짜 및 일반적인 실수.

기사 읽기 →
소프트웨어 테스트

코드 커버리지 설명: 회선 커버리지와 분기 커버리지 및 100%의 실제 의미

실제 Coverage.py 실행을 통해 설명되는 코드 적용 범위: 라인, 분기 및 조건 적용 범위, 보고서 읽기, 100% 적용 범위가 여전히 버그를 놓칠 수 있는 이유 및 합리적인 대상.

기사 읽기 →
데이터베이스 및 SQL

SQL의 DELETE vs TRUNCATE vs DROP: 차이점, 롤백 및 사용 시기

테스트된 SQL을 통해 DELETE 대 TRUNCATE 대 DROP에 대해 설명합니다. 각각의 제거, 롤백, 트리거, ID 재설정, 속도 및 PostgreSQL, MySQL, SQL Server 및 SQLite의 차이점.

기사 읽기 →
데이터베이스 및 SQL

SQL 뷰 설명: 예제를 통해 함정 생성, 사용 및 방지

우리가 실행한 쿼리로 설명된 SQL 뷰: 뷰 생성, 실시간 결과, 열 숨기기, 성능, 업데이트 가능하고 구체화된 뷰, 손상된 종속성 및 모범 사례.

기사 읽기 →
소프트웨어 개발

TypeScript 인터페이스와 유형: 실제 차이점, 컴파일러로 테스트

TypeScript 인터페이스 대 유형, 실제 컴파일러로 확인: 둘 다 할 수 있는 것, 하나만 할 수 있는 것, 선언 병합, 확장 대 교차점 및 따라야 할 간단한 규칙.

기사 읽기 →
소프트웨어 개발

Python *args 및 **kwargs 설명: 명확한 예가 포함된 유연한 함수

Python *args 및 **kwargs는 우리가 실행한 코드(패킹 및 언패킹, 매개변수 순서, 키워드 전용 및 위치 전용 인수, 데코레이터 및 일반적인 오류)를 설명했습니다.

기사 읽기 →
소프트웨어 개발

Python Lambda 함수: 구문, 실제 사용 및 사용하지 말아야 할 경우

Python 람다 함수는 구문, 키를 사용한 정렬, 맵 및 필터, 클로저, 후기 바인딩 트랩, 일반 def가 더 나은 선택인 경우 등 우리가 실행한 코드로 설명되었습니다.

기사 읽기 →
인공지능

AI 에이전트란 ​​무엇입니까? 작동 방식, 간단한 에이전트 루프를 사용하여 실행할 수 있음

AI 에이전트란 무엇입니까? 우리가 실행한 작은 Python 루프, 실제 위험 및 간단한 챗봇이 더 나은 선택일 때 에이전트 루프, 도구, 메모리 및 가드레일에 대한 일반 가이드입니다.

기사 읽기 →
DevOps

모니터링과 관찰 가능성: 로그, 지표, 추적을 통한 실제 차이점

모니터링과 관찰 가능성 설명: 알려진 오류와 알려지지 않은 오류, 로그, 지표 및 추적, 결제 사건 안내, 골든 신호, OpenTelemetry 및 유용한 경고.

기사 읽기 →
DevOps

Docker 볼륨과 바인딩 마운트: 컨테이너 데이터를 올바른 방식으로 유지

Docker 볼륨과 바인드 마운트 설명: 컨테이너 데이터가 사라지는 이유, 명명된 볼륨, 바인드 마운트, tmpfs, Compose 예제, 백업, 권한 및 각 사용 시기.

기사 읽기 →
테스트 자동화

TDD와 BDD: 주요 차이점, 두 가지 방식으로 구축된 하나의 기능 및 각 사용 시기

TDD와 BDD는 두 가지 방식으로 구축된 하나의 할인 기능, 즉 우리가 실행한 코드를 사용한 적록 리팩토링, 주어진 시점 시나리오, 도구, 장단점 및 각 사용 시기를 설명합니다.

기사 읽기 →
소프트웨어 테스트

UAT(사용자 승인 테스트): 프로세스, 체크리스트 및 실제 사례

사용자 승인 테스트는 누가 실행하는지, QA와 어떻게 다른지, 7단계 프로세스, UAT 테스트 사례 템플릿, 체크리스트, 승인 기준 및 일반적인 실수에 대해 설명했습니다.

기사 읽기 →
데이터베이스 및 SQL

SQL NULL 값 설명: IS NULL, COALESCE, NULLIF 및 피해야 할 함정

우리가 실행한 쿼리를 통해 설명된 SQL NULL 값: 3개 값 논리, IS NULL, COALESCE, NULLIF, 집계, 조인 및 정렬이 NULL을 처리하는 방법 및 조용히 발생하는 버그.

기사 읽기 →
데이터베이스 및 SQL

SQL CASE WHEN 문: 구문, 실제 예 및 일반적인 실수

우리가 실행한 쿼리로 설명된 SQL CASE: 단순 및 검색 양식, 조건 순서, SUM이 있는 피벗, COUNT 트릭, 사용자 정의 정렬, 업데이트 및 피해야 할 NULL 트랩.

기사 읽기 →
소프트웨어 개발

JWT란 무엇입니까? 실제 예제로 설명되는 JSON 웹 토큰

JWT란 무엇입니까? JSON 웹 토큰은 세 부분, 즉 우리가 실행한 코드에서 구축 및 변조된 토큰, JWT 대 세션, 저장소, 새로 고침 토큰 및 보안 실수를 설명했습니다.

기사 읽기 →
소프트웨어 개발

JavaScript 이벤트 루프 설명: 예제가 포함된 호출 스택, 마이크로태스크 및 타이머

호출 스택, 작업 및 마이크로태스크 대기열, setTimeout 0이 즉시 실행되지 않는 이유, 차단, 기아 및 인터뷰 퀴즈 등 우리가 실행한 코드로 JavaScript 이벤트 루프를 설명했습니다.

기사 읽기 →
소프트웨어 개발

Python 생성기 및 수율 설명: 실제 예제로 메모리 절약

Python 생성기와 항복은 우리가 실행한 코드로 설명됩니다. 일시 중지 및 재개 방법, 측정된 메모리 절약, 파이프라인, 무한 시퀀스, 항복, 전송 및 공통 트랩.

기사 읽기 →
인공지능

임베딩이란 무엇입니까? 벡터와 코사인 유사성을 간단하게 설명

임베딩이란 무엇입니까? 벡터, 코사인 유사성 및 의미론적 검색에 대한 일반 언어 가이드로, 우리가 실행한 작은 예, 일반적인 용도, 모델 선택 및 알려진 한계를 제공합니다.

기사 읽기 →
DevOps

블루-그린 배포와 카나리아 배포: 차이점, 장단점 및 선택 방법

블루-그린 배포와 카나리아 배포에 대한 설명: 각각의 작동 방식, 비용, 위험 및 롤백, 테스트한 안정적인 사용자 버킷팅, 데이터베이스 마이그레이션, 롤링 업데이트 및 선택 방법.

기사 읽기 →
테스트 자동화

불안정한 테스트: 원인과 해결 방법

우리가 실행한 데모를 통해 불안정한 테스트에 대해 설명했습니다. 주요 원인, 확인 및 진단 방법, 시기, 공유 상태 및 날짜, 격리 프로세스에 대한 적절한 수정 사항.

기사 읽기 →
소프트웨어 테스트

부하 테스트와 스트레스 테스트 비교: 차이점, 측정항목 및 k6 예

부하 테스트와 스트레스 테스트 비교 설명: 각각의 증명, 스파이크 및 흡수 테스트, 중요한 측정항목, 평균이 잘못된 이유, k6 예 및 테스트 계획 방법.

기사 읽기 →
소프트웨어 테스트

테스트 케이스와 테스트 시나리오: 주요 차이점, 예 및 각각의 사용 시기

테스트 케이스와 테스트 시나리오 설명: 명확한 정의, 병렬 테이블, 시나리오에서 케이스로 가져온 하나의 비밀번호 재설정 기능, 템플릿 및 각 사용 시기.

기사 읽기 →
데이터베이스 및 SQL

SQL 쿼리 최적화: 타이밍에 따라 실행 계획을 읽고 느린 쿼리를 수정합니다.

백만 개의 행에서 테스트된 SQL 쿼리 최적화: 실행 계획 읽기, 올바른 인덱스 추가, 분할할 수 없는 필터 수정, 복합 인덱스 및 키 세트 페이지 매김 사용.

기사 읽기 →
데이터베이스 및 SQL

SQL UNION 대 UNION ALL: 테스트된 차이점, 예 및 성능

SQL UNION과 UNION ALL은 우리가 실행한 쿼리(중복, 둘 다 따르는 규칙, 실제 데이터 버그, 측정된 성능, INTERSECT 및 EXCEPT, 각각의 사용 시기)를 설명합니다.

기사 읽기 →
소프트웨어 개발

JavaScript Fetch API 튜토리얼: GET, POST, 오류 처리 및 시간 초과

로컬 서버에 대해 테스트된 JavaScript Fetch API 튜토리얼: GET 및 POST, 404가 발생하지 않는 이유, 재사용 가능한 도우미, 쿼리 문자열, 시간 초과, CORS 및 일반적인 실수.

기사 읽기 →
소프트웨어 개발

Python 파일 처리: 읽기, 쓰기, CSV, JSON 및 pathlib 예제 포함

우리가 실행한 코드로 설명된 Python 파일 처리: 개방형 모드, 대용량 파일 읽기, CSV, JSON, pathlib, 바이너리 파일, 안전한 쓰기, 오류 처리 및 일반적인 실수.

기사 읽기 →
소프트웨어 개발

Python 클래스 및 객체: 실제 예제가 포함된 OOP 튜토리얼

우리가 실행한 코드로 설명된 Python 클래스와 객체: __init__, 메소드, 클래스 대 인스턴스 속성, 상속, 속성, 던더 메소드, 데이터 클래스 및 일반적인 실수.

기사 읽기 →
인공지능

대규모 언어 모델이란 무엇입니까? LLM의 작동 방식, 과대광고 없이 설명

대규모 언어 모델이란 무엇입니까? LLM은 토큰, 임베딩, 주의, 훈련, 온도 및 컨텍스트 창, 작은 다음 단어 데모 및 실제 한계 등 일반 언어로 설명됩니다.

기사 읽기 →
DevOps

초보자를 위한 Linux 명령: 예제가 포함된 필수 터미널 가이드

탐색, 파일, 로그 보기, grep, 파이프, 권한, 프로세스 및 아카이브 등 작업별로 그룹화된 초보자를 위한 Linux 명령과 실용적인 로그 분석 예제가 포함되어 있습니다.

기사 읽기 →
테스트 자동화

셀레늄 대 극작가: 주요 차이점, 코드 비교 및 선택할 항목

Selenium과 Playwright 비교: 아키텍처, 대기, 브라우저 및 언어 지원, 디버깅, 두 도구 모두에서 동일한 테스트, 마이그레이션 조언 및 선택 방법.

기사 읽기 →
소프트웨어 테스트

등가 분할: 실제 예제를 통해 설명되는 테스트 설계 기법

등가 분할 설명: 유효한 파티션과 유효하지 않은 파티션을 찾는 방법, 연령, 비밀번호 및 쿠폰에 대한 작업 예제, 실행한 테스트, 경계와 쌍을 이루는 이유.

기사 읽기 →
소프트웨어 테스트

소프트웨어 테스팅의 심각도와 우선순위: 차이점, 매트릭스 및 실제 사례

소프트웨어 테스팅의 심각도와 우선순위에 대한 설명: 명확한 정의, 예제가 포함된 4방향 매트릭스, 수준 척도, 각 항목을 설정하는 사람 및 버그 분류 실행 방법.

기사 읽기 →
데이터베이스 및 SQL

SQL 하위 쿼리 자습서: 유형, 상관 하위 쿼리 및 EXISTS(예제 포함)

스칼라, IN, FROM 및 SELECT 하위 쿼리, 상관 하위 쿼리, EXISTS, NOT IN NULL 트랩 및 하위 쿼리 대 JOIN 대 CTE 등 우리가 실행한 쿼리가 포함된 SQL 하위 쿼리 자습서입니다.

기사 읽기 →
데이터베이스 및 SQL

SQL 트랜잭션 및 ACID 설명: COMMIT, ROLLBACK 및 격리 수준

COMMIT, ROLLBACK, 저장점, 잠금, 격리 수준, 더티 읽기, 교착 상태 및 모범 사례 등 우리가 실행한 은행 이체를 통해 SQL 트랜잭션 및 ACID를 설명했습니다.

기사 읽기 →
소프트웨어 개발

Git merge vs rebase: 차이점, 예제, 언제 무엇을 쓸까

Git merge vs rebase를 실제 로그 출력, 비교표, rebase의 황금률, 안전한 팀 워크플로로 설명합니다.

기사 읽기 →
소프트웨어 개발

파이썬 리스트 컴프리헨션: 문법, 예제, 피해야 할 때

파이썬 리스트 컴프리헨션 설명: 문법, 필터링, if-else, 중첩 반복문, 실제 측정 시간, 그리고 일반 for 반복문이 더 나은 경우.

기사 읽기 →
데이터베이스 및 SQL

예제로 쉽게 배우는 SQL JOIN (Inner, Left, Right, Full)

샘플 테이블과 쿼리로 SQL JOIN을 단계별로 이해하세요. INNER, LEFT, RIGHT, FULL, CROSS, SELF와 흔한 실수, 성능 팁까지 정리했습니다.

기사 읽기 →