파이썬 모듈 관광 1회: ezpyinline
- 2007년 10월 28일 0시 16분
- 댓글 5 개
요새 블로그가 있다는 존재를 스스로 까먹을 정도로 안 썼더니만 뭔가 블로그 들어오기가 무서워서, 연재물을 하나 구상했습니다. 예전에 회사에서 한번 옆 사람한테 "모듈 관광"을 한번 시켜줬더니 좋아하길래 블로그 버전으로 모듈의 용도와 특징만 겉핥아보는 모듈관광 연재를 해 보려구요!
첫 관광명소(?)로 뭐가 좋을까 한참 고민을 하다가, 아무래도 첫회이니만큼 너무 잘 알려진 모듈을 하면 보는 분들이 지루하지 않을까 싶은 생각이 들었습니다. 그래서 결국 아무도 모를만한(;;) 모듈을 찾아봤는데 뭐 사실 인터넷에 다 있는데 아무도 모를리야 없을테고 그래도 잘 안 쓰지만 저는 매일매일 쓰는 모듈을 하나 건져 올려 봤습니다. :)
처음으로 소개해 드릴 모듈은 "ezpyinline"이라는 모듈인데, 이름에서 풍기듯 "쉽게 파이썬에 C를 인라인"할 수 있는 모듈입니다. 이런 건 전에도 몇 번 나오기는 했지만, 그래도 보통 시대 흐름에 따라서 요구사항이 달라지는데 오래 전에 나온 것은 스타일도 다르고 여러모로 취향이 다르니까 새것이 유지만 잘 되면 쓰기는 편할 것 같네요.
인라인 같은 요구사항이 있을 때는 보통 C로 간단하게 인터페이스를 줄인 다음에 pyrex를 쓰거나, SWIG같은 래퍼를 쓰거나, 아니면 직접 다 모듈을 짜버리는 방법이 정통적인 방법입니다. 간단한 것 할 때는 뭘 해도 상당히 귀찮죠. 파이썬은 역시 기동성이 힘! ez붙은 건 거짓말만 아니라면 다 한번씩은 봐 둘 가치가 있겠죠;
관광에 설명이 너무 많으면 안 되니 경치구경으로 대신합니다. :)
>>> import ezpyinline
>>> cfactorial = ezpyinline.C(r"""\
... int factorial(int v)
... {
... int i, r = 1;
... for (i = 2; i <= v; i ++) r *= i;
... return r;
... }""").factorial
>>> cfactorial(1)
1
>>> cfactorial(12)
479001600
진정 보람을 느끼려면 항상 예전과 비교를.. ^.^
>>> def pyfactorial(v): ... return reduce(lambda x, y: x * y, range(2, v+1), 1) ... >>> def mytimeit(f, *args): ... st = time.time() ... for i in xrange(1000000): ... f(*args) ... return time.time() - st ... >>> mytimeit(cfactorial, 12) 0.39980006218 >>> mytimeit(pyfactorial, 12) 5.71780800819
대략 10배 넘게 성능 향상이 있었습니다. 와우~! (뻔한 일에도 감동을;)
그래도 아무래도 타입이 조금만 복잡해져도 자동 처리가 난감해지고 하는 면이 있기 때문에, 아주 인터페이스를 단순화해서 임시 실험용으로 쓸 코드에서 C코드로 가속을 하고 싶을 때 유용할듯 합니다.
자 그럼 다음 이 시간에 또 만나요~ (TV 세계관광 프로그램 컨셉으로;;)
