ݺߣ

ݺߣShare a Scribd company logo
0 
Python 
Extension 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와 다른 
동적 타이핑을 사용한다. 
강력한 리플렉션이 가능하다.
나는 Jython야 
나는 
Java형 하고 한몸 
6 
나는 Cpython !! 
내가 원조지 
나는 IronPython이야 
나는 Pypy야 ^^ 
외계에서 왔어 
인터프리터가 한 개가 아니다.
7 
단점도 있는데.. 
C/C++과 같은 컴파일 언어에 비해 속도가 느리다. 
GIL때문에 멀티 스레드가 안됨. 
Python 3.x의 하위 호완성 무시 
나도 완벽하진 않아.
8 
조금 느린편이야..
9 
C 확장을 사용한다면 어떨까?
10 
C 확장은 최강의 무기
11 
C-Extension은 일반적인 파이썬 인터프리터 구현체인 
CPython에서 동작 
인터프리터로 해석되는 방식이 아닌 Machine Code가 삽입 
되어 동작하므로 성능도 좋은 편 
Python C API가 제공되므로 생각 외로 구현이 쉬움 
반대로 C프로그램에서 Python Interpretor를 내장할 수 
도 있음 
C Extension의 장점
12 
Python Vs C Extension
13 
timeit 모듈을 사용해서 실행 시간 측정 
(Measure execution time of small code snippets) 
테스트 코드 Loop Count: 5만 - 20만 (증가 값 5천) 
총 30번 수행 
Python Vs C Extension
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:Python27include 폴더를 include 하고 C:Python27libs를 라이브러리 경 
로로 지정한다. 
4) “PyMODINIT init모듈이름 ()” 함수를 정의한다. 
5) Python API를 사용하여 함수를 작성한 후 PyMethodDef 배열을 통해 함수목록을 
생성한다. 
6) Py_InitModule 함수를 통해 테이블을 등록하고 모듈을 초기화 한다. 
7) VS2010에서 컴파일한 후 결과물인 changext.dll 파일을 changext.pyd로 바꾼다. 
어떻게 확장 프로그램을 짤까?
17 
링크를 따라가서 살펴봅시다. (초기화 소스) 
https://github.com/qwefgh90/AlgorithmSolution/bl 
ob/master/PythonExtension2010/PythonExtensi 
on2010/main.cpp 
링크를 따라가서 살펴봅시다. (구현 소스) 
https://github.com/qwefgh90/AlgorithmSolution/bl 
ob/master/PythonExtension2010/PythonExtensi 
on2010/py_algorithm.cpp 
어떻게 확장 프로그램을 짤까?
18 
결론은 Python.h 에 정의된 함수를 사용해서 손쉽게 코딩 
을 할 수 있습니다. 
어떻게 확장 프로그램을 짤까?
2) 파이썬 타입을 정의 
하는 구조체에 
malloc 같은거 써서 
19 
python.exe 
CPython 인터프리터 
1) 스크립트를 해석한 후 
2) 동적 할당을 이용한 
동적으로 
파이썬 변수 생성 
hellworld.py 
4) 파이썬 API를 이용해 
파이썬의 모든 자원을 
손쉽게 생성 및 접근 
changExt.dll(pyd) 로드 
Python C Extension 
3) 파이썬 API를 이용해 
확장 프로그램 호출
20 
Red Black Tree 포팅
21 
Red Black Tree 포팅
22 
Red Black Tree 포팅
23 
간단한 절차 
1) 라이브러리의 기능을 바탕으로 인터페이스를 구성한다. (예: 계산기 덧셈, 뺄샘) 
2) C 변수로 관리할 자료구조를 생각해본다. 
3) C 확장과 파이썬이 어떤 데이터를 주고 받을지 생각한다. 
4) 위 내용을 바탕으로 인터페이스를 구현한다. 
팁 
- Python 변수에서 C자료 구조를 사용할 땐 Capsule이라는 클래스에 포인터를 삽입 
해서 사용한다. 
- Python 변수는 참조되지 않으면 쉽게 사라지므로 Capsule이 사라질 때 소멸자로 자 
원 해제를 한다. 
Red Black Tree 포팅
24 
RBTree 기능 (헤더) 
https://github.com/qwefgh90/AlgorithmSolution/b 
lob/master/PythonExtension2010/PythonExtension 
2010/rbtree.h 
RBTree를 위한 C확장 
https://github.com/qwefgh90/AlgorithmSolution/b 
lob/master/PythonExtension2010/PythonExtension 
2010/py_rbtree.h 
Red Black Tree 포팅
25 
Red Black Tree 포팅
26 
Red Black Tree 포팅
27 
시연
28 
감사합니다.
29 
감사합니다.

More Related Content

141103 최창원 파이썬 확장 프로그래밍

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

Editor's Notes

  • #7: class ClassA(object):     email = ''     name = ''   strong = ClassA() strong.email = 'kelp[at]phate.org' strong.name = 'Kelp'   모듈, 클래스, 객체와 같은 언어의 요소가 내부에서 접근 for name in dir(strong):     attr = getattr(strong.__class__, name)     if not callable(attr) and name.find('__') != 0:         print('%s = %s' % (name, getattr(strong, name)))
  • #8: from socket import socket socket = socket(); socket.connect(('www.naver.com',80)) recv = socket.send('GET / http/1.1\r\n\r\n') socket.recv(1024)