며칠 전 Miguel의 블로그에 올라온 블로그가 크게 파장을 일으키고 있네요. Jython 개발자인 Jim Hugunin이 .NET 기반의 새로운 파이썬인 Iron Python을 만들어서 Microsoft 내부 메일링 리스트에 결과를 올렸는데, 예전의 Active State의 구현이나 Parrot계열의 Pirate의 실망스러운 결과와는 완전 상반되게 70%나 CPython보다 빠르다는 결과를 얻었다고 합니다. (원본 메일 (Miguel의 복사본))
1 2 3 4 5 6 7 8 9 10 |
IronPython과 CPython, Jython의 벤치마크 (숫자가 낮을 수록 빠름) IronPython-0.1 Python-2.3 Python-2.1 Jython-2.1 pystone 0.58 1.00 1.29 1.61 function call 0.19 1.00 1.12 1.33 integer add 0.59 1.00 1.18 1.08 string.replace 0.92 1.00 1.00 1.40 range(bigint) 5.57 1.00 1.09 16.02 eval("2+2") 66.97 1.00 1.58 91.33 |
특히나 function call, integer add쪽은 CPython에서 엄청난 오버헤드가 있는 것으로 유명했던 부분이라.. 역시나 IL asm으로 직접 번역하는 것으로 구현된 Iron Python보다 엄청나게 느린 것으로 결과가 나왔군요. 그리고 range의 경우에는 메모리 할당이 단편적으로 엄청나게 일어나기 때문에 CPython이 유리한 게 나왔고 eval(“2+2”)쪽은 CPython은 컴파일러가 순수 C로 구현되어있기 때문에, 흐흐..
하여간 .NET IL asm으로 직접(C# 안 거치고) 파이썬 코드를 번역하면 아무래도 CPython보다 더 빠르지 않을까 생각하던 초기 .NET 개발자들의 예상은 대충 맞았다는 것이 증명되고 있는 듯 합니다. 아직 Iron Python이 많이 구현되지 않은 반면 최적화를 수행하지 않았기 때문에, 앞으로 변동이 좀 있을 것 같기도 한데.. 하여간 무지 기대가 되네요. (MS에 팔아먹으면 대략 낭패 –; )
한편, Iron Python이 오픈소스가 아닌 MS나 다른 회사의 상용 제품으로 들어가는 것을 대비해서 최적화를 계획해야할 텐데, CPython도 이제 슬슬 표준 환경에서의 JIT 지원에 대해서 본격적으로 진지하게 고려해 봐야 할 것 같기도 합니다. (PyPython은 아직 까마득.. 으흐…)
제가 궁금한 것은 Python+Psyco와의 속도 비교입니다. 정수 연산과 함수 호출이 JIT로 빨라지는 거라면, 파이썬에 특화된 Psyco가 훨씬 더 잘 할 것 같은데요. 정수 연산의 경우 Psyco 써 주면 기본 4배, 최대 100배까지 나옵니다.
다시 말하자면… Psyco는 이미 CPython의 표준 JIT 환경이라고 생각합니다. 2.2 버전에서는 Psyco를 지원하기 위해 메인 인터프리터에 프로파일링 훅이 추가되기도 했죠.
아직 IronPython은 Psyco처럼 변수의 쓰임새까지 판단한 최적화는 전혀 하고 있지 않기 때문에, 별로 아직 벤치마크를 할 단계는 아니라고 봅니다.
IronPython은 현재 정수 덧셈 같은 곳에서, CPython과 같은 방법으로 정직하게 네임스페이스에서 로드해서 객체를 작업하고 있다고 합니다. IL asm으로 CTS integer 타입으로 정수 덧셈을 직접 하도록 최적화가 더 이루어진다면 그때는 Psyco와 겨룰만 해 지겠죠.
Psyco도 정말 놀라운 정도의 JIT시스템을 개발했지만 .NET이나 Parrot 정도의 JIT 능력을 갖추기 위해서는 지금처럼 Psyco를 가능하게 하는 정도가 아니라, 아예 C-API 자체가 JIT를 가능하도록 하는 정도의 변경이 필요하다고 봅니다.
현재 Psyco는 C-API가 필요한 경우에 아무리 짧은 함수라도 모두 호출에 의존하고 있는데, 두세겹으로 싸인 C측 함수들을 쓰는 것 보다 parrot이나 IronPython식으로 인라인 가능한 JIT 인스트럭션으로 만들어버리는 것이 훨씬 가능성이 있겠죠. 이런 것을 가능하게 하기 위해서는 현재 Psyco와 CPython같은 공식적인 관계로는 부족하다고 봅니다.
물론.. 이렇게 되면 너무 많은 부분이 PyPython과 겹치기 때문에, 이렇게 될 확률은 거의 없지만서도.. 🙂
(-_- 왠지 이상한 질문이 될 것 같지만) AsmPython(어셈블리 버젼)은 불가능한 걸까요?
므흐흐.. 코드를 알아보기 힘들잖아용 =3 =33
아하! =3 =33
전 축복받지 못한 이군요 -0-
macfuse + sshfs는 한글 파일을 바로 열지 못하는 약점이…