첫째, 모아서 반환하기 전에 yield를 생각해
호출자가 결과를 한 번씩 읽을 수 있다면 빈 리스트에 append한 뒤 반환하는 대신 바로 yield해. 첫 값이 더 빨리 도착하고 큰 입력도 견뎌.
둘째, 리듀서에는 제너레이터 표현식을 넣어
합계·존재 여부·모두 만족 여부처럼 결과 하나로 줄이는 함수는 중간 리스트를 요구하지 않아. 필요한 값만 흘려보내면 돼.
셋째, 단계를 작게 나눠
읽기·파싱·필터링을 따로 만들면 각 단계가 독립적으로 시험되고 다른 조합에도 쓰여. 하나의 거대한 제너레이터보다 이름 붙은 작은 흐름이 읽기 좋아.
넷째, 직접 중첩 반복문을 쓰기 전에 itertools를 봐
이어 붙이기, 구간 고르기, 조합, 묶기 같은 반복 모양은 이미 검증된 표준 도구가 있을 가능성이 커. 다만 도구 이름이 의도를 가리지 않는지도 함께 판단해.
게으른 흐름을 무심코 다시 쌓지 마
뚜렷한 이유 없이 흐름 한가운데서 list()를 호출하면 지금까지의 지연 계산을 한꺼번에 메모리에 올려. 같은 반복자를 두 번 순회하고 두 번째가 빈 것을 버그로 오해하지도 마. 반복 복사가 꼭 필요하더라도 작은 값을 그냥 목록으로 만드는 편이 선명하다면 tee보다 그쪽이 나아.
Python다운 기준: 기본은 게으르게 흘려보내고, 길이·인덱싱·슬라이스·반복 순회처럼 저장이 실제로 필요한 경계에서만 구체적인 모음으로 만들어.