Upload
changwon-choe
View
534
Download
5
Embed Size (px)
Citation preview
0
PythonExtension with C/C++
And Porting Design인천대학교OneScore
200901319 최창원
1
INDEX.
발표소개
파이썬소개
파이썬확장
확장성능
1 2 3 4
포팅(이식)설계
5
마무리으리
6
2
발표 소개
1
3
파이썬이 뭔대
파이썬이 확장이 왜 필요해요?
내가 만든 코드를 옮길 수 있어요? 가능?
발표 시간이 너무 길거 같에요
오늘 할 내용
4
파이썬은 OOOO 이다.
1991년귀도 반 로섬에 의해 탄생
문법이 쉽고 직관적이다.
built-in 라이브러리가 많아할 수 있는게 매우 많다.
크로스 플랫폼을 지원한다.
5
Feature
인터프리터위에서 실행된다.
C와 Java와 다른동적 타이핑을 사용한다.
강력한 리플렉션이 가능하다.
6
인터프리터가 한 개가 아니다.
나는 Cpython !!내가 원조지
나는 IronPython이야
나는 Jython야나는Java형 하고 한몸
나는 Pypy야 ^^외계에서 왔어
7
나도 완벽하진 않아.
단점도 있는데..
C/C++과 같은 컴파일 언어에 비해 속도가 느리다.
GIL때문에 멀티 스레드가 안됨.
Python 3.x의 하위 호완성 무시
8
조금 느린편이야..
9
C 확장을 사용한다면 어떨까?
10
C 확장은 최강의 무기
11
C Extension의 장점
C-Extension은 일반적인 파이썬 인터프리터 구현체인CPython에서 동작
인터프리터로 해석되는 방식이 아닌 Machine Code가 삽입되어 동작하므로 성능도 좋은 편
Python C API가 제공되므로 생각 외로 구현이 쉬움
반대로 C프로그램에서 Python Interpretor를 내장할 수도 있음
12
Python Vs C Extension
13
Python Vs C Extension
timeit 모듈을 사용해서 실행 시간 측정
(Measure execution time of small code snippets)
테스트 코드 Loop Count: 5만 - 20만 (증가 값 5천)
총 30번 수행
14
Python Vs C Extension
(초)
루프 카운트(만)
15
어떻게 확장 프로그램을 짤까?
http://qwefgh90.github.io
확장 개발 방법을 한글로 발번역 해놨습니다.
장담 못함….
참조할 만한 동영상 (Visual Studio 기준)
http://www.youtube.com/watch?v=y_eh00oE5rI
16
어떻게 확장 프로그램을 짤까?
구현 절차는 다음과 같다. (Visual Studio 기준)1) C 확장 모듈의 이름을 결정한다. (changext 로 가정한다.)
2) 결정한 모듈 이름으로 win32 - DLL 개발 프로젝트를 생성한다.
3) C:\Python27\include 폴더를 include 하고 C:\Python27\libs를 라이브러리 경로로 지정한다.
4) “PyMODINIT init모듈이름 ()” 함수를 정의한다.
5) Python API를 사용하여 함수를 작성한 후 PyMethodDef 배열을 통해 함수목록을생성한다.
6) Py_InitModule 함수를 통해 테이블을 등록하고 모듈을 초기화 한다.
7) VS2010에서 컴파일한 후 결과물인 changext.dll 파일을 changext.pyd로 바꾼다.
17
어떻게 확장 프로그램을 짤까?
링크를 따라가서 살펴봅시다. (초기화 소스)
https://github.com/qwefgh90/AlgorithmSolution/blob/master/PythonExtension2010/PythonExtension2010/main.cpp
링크를 따라가서 살펴봅시다. (구현 소스)
https://github.com/qwefgh90/AlgorithmSolution/blob/master/PythonExtension2010/PythonExtension2010/py_algorithm.cpp
18
어떻게 확장 프로그램을 짤까?
결론은 Python.h 에 정의된 함수를 사용해서 손쉽게 코딩을 할 수 있습니다.
19
Python C Extension
python.exe
CPython 인터프리터
hellworld.py
1) 스크립트를 해석한 후
changExt.dll(pyd) 로드
2) 동적 할당을 이용한동적으로파이썬 변수 생성
4) 파이썬 API를 이용해파이썬의 모든 자원을손쉽게 생성 및 접근
3) 파이썬 API를 이용해확장 프로그램 호출
2) 파이썬 타입을 정의하는 구조체에
malloc 같은거 써서
20
Red Black Tree 포팅
21
Red Black Tree 포팅
22
Red Black Tree 포팅
23
Red Black Tree 포팅
간단한 절차
1) 라이브러리의 기능을 바탕으로 인터페이스를 구성한다. (예: 계산기 덧셈, 뺄샘)
2) C 변수로 관리할 자료구조를 생각해본다.
3) C 확장과 파이썬이 어떤 데이터를 주고 받을지 생각한다.
4) 위 내용을 바탕으로 인터페이스를 구현한다.
팁
- Python 변수에서 C자료 구조를 사용할 땐 Capsule이라는 클래스에 포인터를 삽입해서 사용한다.- Python 변수는 참조되지 않으면 쉽게 사라지므로 Capsule이 사라질 때 소멸자로 자원 해제를 한다.
24
Red Black Tree 포팅
RBTree 기능 (헤더)
https://github.com/qwefgh90/AlgorithmSolution/blob/master/PythonExtension2010/PythonExtension2010/rbtree.h
RBTree를 위한 C확장
https://github.com/qwefgh90/AlgorithmSolution/blob/master/PythonExtension2010/PythonExtension2010/py_rbtree.h
25
Red Black Tree 포팅
26
Red Black Tree 포팅
27
시연
28
감사합니다.
29
감사합니다.