[common] optimization vs maintainability,readability - dsindex/blog GitHub Wiki
개발을 하다보면 항상 최적화에 대한 니즈가 생기기 마련이다. 일반적으로 어떤 모듈을 잘 만들었는가 그렇지 않은가는 진짜 대규모의 데이터를 돌려보면 감이 온다. 대규모 데이터를 빠른 시간내에 처리하기 위해서는 멀티프로세스나 멀티쓰레드(혹은 map-reduce
)로 구동시키는 경우가 많은데, 기본적으로 이런 프레임웍에서 메모리도 효율적으로 사용하고(예, mmap
으로 공유) 처리도중 문제를 발생시키지 않으면서 매우 효과적인 알고리즘으로 동작하게하는 모듈을 만들었다면 별 문제는 없을듯 하지만~ 잘못 만들어진 모듈의 경우는 프로파일링을 통해 비효율적인 부분을 발견해서 최적화시키는 작업을 수행하게 되는데, 어느정도까지 최적화를 시킬지 애매한 케이스가 존재한다. 마치 precision과 recall처럼 지나치게 최적화를 시키면 가독성과 유지보수성이 떨어지게되어서 적절한 경계를 결정하는 것은 쉽지않아보인다.
이런 문제에 대한 일반적인 해결책은 없겠지만, 처리하는 문제 영역을 자연어처리로 좁히면 c
와 python
을 병합해서 사용하는 것도 좋은 방법중 하나일것 같다.
- 매우 복잡한 연산으로 시간복잡도가 높고 메모리 관리를 효율적으로 해야하는 부분은 c로 구현
- 예를 들면,
형태소분석기
,aho-corasick
,trie
- python이나 java로는 한계가 있다.
매우 효율적인 메모리 관리를 기대한다면 포기하는게 편할듯
- 이것에
python wrapper
를 구현해서 python에서 사용가능하게 한다.
- 그리고 나서 문제 해결을 위한 일반적인 프레임에 python을 사용
- 이제 문제를 해결한다. 문제 해결을 위한 python code를 작성할때도 python 언어 특징을 충분히 고려해서 효율적인 방식으로 코딩하는 것이 아주 중요하다.
- pythonic code는 내부적으로 아주 많이 튜닝되었기 때문에, 쓸데없이 그것을 자신의 방식으로 구현한다고 삽질하지 말것