본문 바로가기

카테고리 없음

Python [실험 : bs4 vs rexg(시간, 용량)]

반응형

실험 목적

이 실험은 HTML 파싱 작업에서 Python의 BeautifulSoup(bs4)와 정규식(regx)을 사용했을 때의 성능 차이를 분석하고, bs4의 경우 가비지 컬렉터 사용 여부에 따른 효과를 비교하는 데 목적이 있다. 이를 통해 대규모 데이터를 다루는 작업에서 속도와 메모리 효율성을 고려한 최적의 도구 선택을 위한 실험이다.

실험 방법

  1. 테스트 환경
    • Python 3.8
    • 시스템 사양: 메모리 8GB, i5 프로세서
    • 각 HTML 파싱 방식에 대해 1,000회의 반복 테스트 수행
    • 사용 도구: memory_profiler, tracemalloc로 메모리 사용량 체크, timeit으로 수행 시간 측정
  2. 비교 항목
    • 시간 측정: timeit을 이용하여 총 실행 시간(cumtime), 호출 횟수(ncalls), 호출당 시간(percall)을 비교.
    • 메모리 측정: memory_profiler와 tracemalloc으로 메모리 사용 전후 차이 및 증가량을 기록.

실험 결과

  1. BeautifulSoup (bs4)
    • 가비지 컬렉터 미사용
      • 시간: 총 실행 시간 642.514초, 호출당 평균 0.643초
      • 메모리 사용량
        • memory_profiler: 85.7 MiB → 92.0 MiB (6.3 MiB 증가)
        • tracemalloc: 0.95 KB → 2627.32 KB (2626.37 KB 증가)
      • 특징: 메모리 사용량이 크게 증가하여 대규모 데이터를 다룰 때 메모리 문제 발생 가능성 높음.
    • 가비지 컬렉터 사용
      • 시간: 총 실행 시간 623.121초, 호출당 평균 0.623초
      • 메모리 사용량
        • memory_profiler: 85.4 MiB → 100.8 MiB (15.4 MiB 증가)
        • tracemalloc: 0.95 KB → 8281.75 KB (8280.80 KB 증가)
      • 특징: 가비지 컬렉터를 사용할 경우 메모리 증가율이 더 높지만, 실행 시간은 미세하게 향상됨. 여전히 메모리 소비량이 커 메모리 효율성은 떨어짐.
  2. 정규식 (regx)
    • 시간: 총 실행 시간 583.492초, 호출당 평균 0.583초
    • 메모리 사용량
      • memory_profiler: 85.4 MiB → 90.3 MiB (4.9 MiB 증가)
      • tracemalloc: 0.95 KB → 933.06 KB (932.11 KB 증가)
    • 특징: 정규식은 메모리 소비가 가장 적고, 실행 시간도 상대적으로 짧음. 특히 대규모 HTML 데이터를 처리하는 경우 bs4보다 효율적인 선택이 될 수 있음.

분석 및 결론

  1. 시간 효율성: 가비지 컬렉터 사용 여부와 상관없이 정규식이 bs4보다 빠르게 수행되었으며, bs4 내에서도 가비지 컬렉터 사용 여부에 따른 시간 차이는 크지 않음.
  2. 메모리 효율성: bs4는 가비지 컬렉터를 사용할 경우 메모리 사용량이 더 증가했으며, 가비지 컬렉터 사용 여부에 관계없이 정규식보다 메모리 소비가 높음. 반면 정규식은 메모리 사용이 적어 대용량 데이터를 다루는 데 더 효율적.
  3. 종합 결론: HTML 파싱에서 메모리와 시간 효율성을 중시한다면 정규식을 사용하는 것이 유리함. 그러나 복잡한 HTML 구조를 파싱할 때는 유지 보수성과 가독성 면에서 bs4가 유리할 수 있으며, 이 경우 메모리 문제 발생 가능성을 줄이기 위해 가비지 컬렉터를 신중하게 관리해야 함.