요새 블로그가 있다는 존재를 스스로 까먹을 정도로 안 썼더니만
뭔가 블로그 들어오기가 무서워서, 연재물을 하나 구상했습니다.
예전에 회사에서 한번 옆 사람한테 “모듈 관광”을 한번 시켜줬더니
좋아하길래 블로그 버전으로 모듈의 용도와 특징만 겉핥아보는
모듈관광 연재를 해 보려구요!
첫 관광명소(?)로 뭐가 좋을까 한참 고민을 하다가, 아무래도
첫회이니만큼 너무 잘 알려진 모듈을 하면 보는 분들이
지루하지 않을까 싶은 생각이 들었습니다. 그래서 결국 아무도
모를만한(;;) 모듈을 찾아봤는데 뭐 사실 인터넷에 다 있는데
아무도 모를리야 없을테고 그래도 잘 안 쓰지만 저는 매일매일
쓰는 모듈을 하나 건져 올려 봤습니다. 🙂
처음으로 소개해 드릴 모듈은 “ezpyinline“이라는 모듈인데,
이름에서 풍기듯 “쉽게 파이썬에 C를 인라인”할 수 있는 모듈입니다.
이런 건 전에도 몇 번 나오기는 했지만, 그래도 보통 시대 흐름에
따라서 요구사항이 달라지는데 오래 전에 나온 것은 스타일도 다르고
여러모로 취향이 다르니까 새것이 유지만 잘 되면 쓰기는 편할 것 같네요.
인라인 같은 요구사항이 있을 때는 보통 C로 간단하게 인터페이스를
줄인 다음에 pyrex를 쓰거나, SWIG같은 래퍼를 쓰거나, 아니면 직접 다 모듈을 짜버리는 방법이 정통적인 방법입니다.
간단한 것 할 때는 뭘 해도 상당히 귀찮죠. 파이썬은 역시 기동성이 힘! ez붙은 건 거짓말만 아니라면 다 한번씩은 봐 둘 가치가 있겠죠;
관광에 설명이 너무 많으면 안 되니 경치구경으로 대신합니다. 🙂
1 2 3 4 5 6 7 8 9 10 11 12 |
>>> 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 |
진정 보람을 느끼려면 항상 예전과 비교를.. ^.^
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> 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 세계관광 프로그램 컨셉으로;;)
아싸 1등~*
멋지군요.
저처럼 파이썬을 접한지 얼마 되지 않는 사람에게 유익한 시리즈 이군요. ^^
헉 무서운 모듈이네요. 신기한거 잘 봤습니다. 그런데… 내부 구현이 어떻게 되어있는 건지 궁금해지네요. 지금 받아서 열어보기도 사정이 딱하고(?);; 설마 리얼타임으로 컴파일 하진 않을테니깐 말이지요.
파이썬 모듈을 컴파일해서 ~/.ezpyinline에 저장하는 군요.
파이썬 자체가 C로 구현되어 있기 때문에;;