취미 생활로[1] 하는 일 중에 하나가 프로젝트 오일러 라고 부르는 프로그래밍/수학 문제 웹사이트의 문제들을 푸는 것인데.
프로젝트 오일러에선,
라는 식의 약간의 수학 + 알고리즘 문제들을 잔뜩 가지고 있다. 작년 초에 python에 좀 더 익숙해질 겸, 머리도 식힐 겸 — 프로그래머 스럽지아니한가 :$ – 시작했는데, 작년 말부터 좀 뜸하다가 요즘 다시 손을 대기 시작했다. Python을 사용해서 이런 문제를 풀면 얻게 되는 이익은,
인데, 사실 문제도 꽤 있다. 작년에 풀었던 문제 중에 python으로 2시간 10분 가량 돌려서 결과가 나왔던 문제가 있는데, 나중에 GMP[2] 를 써서 해보니 1분 안쪽으로 줄어들더라고(…). 백배도 넘는 실행 시간 차이를 본 순간 -_-
이런 문제를 극복할 수 있는 — 적어도 일부 영역에서는 – 수단이 python에는 있다. 프로젝트 오일러를 주로 할 때에는 생각 못하고 있었는데, 최근 저걸 다시 생각해내고 넣어가면서 몇 개 테스트 해봤는데, 보통 4배에서 10배정도 가속되더라. 즉 전에 수 분 정도 걸린던게 수 초 ~ 수십 초 수준으로 실행속도가 빨라진 것.
바로 pysco 라는 x86 용의 파이썬 라이브러리덕분인데, 아주 간단한 코드만으로도 상당한 효율을 볼 수 있다. 예를 들어, 원래 코드의 앞 부분에 다음과 같은 부분만 들어가면된다.
import psyco
psyco.full()
…대략 이것만으로 프로젝트 오일러를 풀면서 작성했던 코드들이 수 배 향상된 속도로 동작하는 걸 확인할 수 있었다. 입사시험 문제의 일부로 사용한 문제들을 python으로 풀어보는데, 같은 코드를 C++로 작성해서 비교해봐도 8~20배 안쪽의 차이로 동작하는걸 확인할 수 있었다.[3]
물론 psyco의 동작자체가 완전히 JIT는 아니고, 타입에 따라 별도의 특수화 코드를 생성해내는 방식이라 상당히 많은 메모리 (10~100배 정도? 내가 경험해본건 대략 10~30배) 를 사용해서 속도를 올리는 방식이라 매우 큰 코드 블럭에서는 약간 부적당할지도 모른다. 그 경우엔 위 처럼 psyco.full() 로 최적화 하는게 아니라 프로파일링 + 부분최적화[4] 할 수 있는 수단을 제공해준다. 이건 프로젝트 오일러 문제 풀 수준의 코드에선 별로 볼 일이 없어서 잘 모르겠지만[...]
완전히 새로운 VM 구현도 아니고, 인터프리터 구현도 아닌, 그렇지만 간단히(?) 라이브러리 임포트 + 몇 줄 추가로 상당한 효율을 얻을 수 있다는 점에서 python의 매력이 점점 강해진달까 :$
간단한 프로그램을 만들 때 뭔가 어정쩡한 편리함/속도인 C#/Java를 쓸 일이 점점 더 줄어드는 기분…
젤 밑에…각주라고 하나요? 거기에 오타가 2개 ![]()
취마 -> 취미
SIM -> SIMD
그럼 후다닥 ㅡ _-;;
Written by kalstein on May 26, 2008 at 11:23am
Jump to comments