파이썬 프로그램을 C / C ++로 변환 할 수 있습니까?
몇 가지 알고리즘을 구현해야하며 C / C ++에서 내가 할 때 겪는 모든 고통을 정당화하기에 성능 격차가 충분히 큰지 확실하지 않습니다 (잘 모르겠습니다). 하나의 간단한 알고리즘을 작성하고 그러한 변환 된 솔루션에 대해 벤치마킹했습니다. 그것만으로 파이썬 버전보다 훨씬 빠르면 C / C ++에서 다른 것을 선택할 수 없습니다.
파이썬 프로그램을 C / C ++로 변환 할 수 있습니까?
몇 가지 알고리즘을 구현해야하며 C / C ++에서 내가 할 때 겪는 모든 고통을 정당화하기에 성능 격차가 충분히 큰지 확실하지 않습니다 (잘 모르겠습니다). 하나의 간단한 알고리즘을 작성하고 그러한 변환 된 솔루션에 대해 벤치마킹했습니다. 그것만으로 파이썬 버전보다 훨씬 빠르면 C / C ++에서 다른 것을 선택할 수 없습니다.
답변:
예. Cython을 보십시오 . 속도 향상을 위해 Python을 C로 변환합니다.
cdef
선언 을 추가하고 정적 타이핑을 도입 하지 않으면 아무것도 저장하지 않습니다 (그렇지 않으면 불투명 한 PyObject *
물건을 저글링합니다 ). 평범한 C만큼 빠르지는 않습니다. 보통 파이썬과 인터페이스하기 때문입니다. 그러나 그 외에는, 예를 들어 꽤 빠르 게 속도를 높일 수 있습니다.
C 변형이 x 시간 더 적게 필요하면 알고리즘을 더 오래 / 다시 실행하는 데 그 시간을 투자합니다.
여기서 "invest"는 올바른 단어가 아닙니다.
Python에서 작동하는 구현을 빌드하십시오. C 버전을 마치기 전에이 과정을 마치게됩니다.
Python 프로파일 러로 성능을 측정하십시오. 찾은 문제를 해결하십시오. 실제로 올바르게 수행하려면 데이터 구조와 알고리즘을 변경하십시오. C에서 첫 번째 버전을 완료하기 전에이 과정을 마치게됩니다.
여전히 너무 느리면 잘 디자인되고 신중하게 구성된 Python을 C로 수동으로 변환하십시오.
가늠자가 작동하는 방식으로 인해 기존 Python에서 두 번째 버전 (기존 단위 테스트 및 기존 프로파일 링 데이터 사용)을 수행하는 것이 C 코드를 처음부터 작성하는 것보다 여전히 빠릅니다.
이 인용문은 중요합니다.
최초 망원경 제조업자를위한 톰슨의 규칙
6 인치 거울을 만드는 것보다 4 인치 거울을 만든 다음 6 인치 거울을 만드는 것이 더 빠릅니다.빌 맥키 난
왕 연구소
Shed Skin 은 "제한된 Python-to-C ++ 컴파일러"입니다.
그냥이 건너 온 이 해커 뉴스의 새로운 도구.
"Nuitka는 Python 인터프리터를 대체하기에 적합하며 CPython 2.6, 2.7, 3.2 및 3.3이 제공하는 모든 구문을 컴파일합니다. Python을 C ++ 프로그램으로 변환 한 다음"libpython "을 사용하여 동일한 방식으로 실행합니다. CPython은 매우 호환 가능한 방식으로 작동합니다. "
.exe
OSX Mach-O 실행 파일이 완벽하게 작동하지만 OSX 에서 확장 기능을 가진 바이너리를 생성하는 것은 재미 있습니다 . 그것은 같은 외모에 대한 좋은 대체 될 수 pyinstaller
, py2exe
, py2app
, 등 --recurse-***
플래그는하지만 제대로 설정하는 것이 중요하다.
Shed Skin 외에 C ++로 변환하는 또 다른 옵션 은 Pythran 입니다.
Micha Gorelick과 Ian Ozsvald의 고성능 Python 을 인용하려면 :
Pythran은 부분
numpy
지원 을 포함하는 Python의 하위 세트를위한 Python-to-C ++ 컴파일러입니다 . Numba 및 Cython과 비슷하게 작동합니다. 함수의 인수에 주석을 달고 추가 유형 주석 및 코드 특수화를 수행합니다. 벡터화 가능성과 OpenMP 기반 병렬화 가능성을 활용합니다. Python 2.7 만 사용하여 실행됩니다.Pythran의 매우 흥미로운 기능 중 하나는 병렬화 기회 (예 :를 사용하는 경우)를 자동으로 발견하여
map
추가 노력없이 병렬 코드로 변환한다는 것입니다.pragma omp
> 지시문을 사용하여 병렬 섹션을 지정할 수도 있습니다 . 이와 관련하여 Cython의 OpenMP 지원과 매우 유사합니다.배후에서 Pythran은 일반적인 Python과 numpy 코드를 모두 사용하여 Cython의 결과보다 훨씬 빠른 C ++로 공격적으로 컴파일하려고 시도합니다.
이 프로젝트는 젊으 며 버그가 발생할 수 있습니다. 또한 개발 팀은 매우 친숙하며 몇 시간 안에 버그를 수정하는 경향이 있습니다.
나는 이것이 오래된 스레드라는 것을 알고 있지만 도움이되는 정보라고 생각하는 것을주고 싶었습니다.
나는 개인적으로 pip를 사용하여 설치하기 쉬운 PyPy를 사용합니다. Python / PyPy 인터프리터를 상호 교환 적으로 사용하므로 코드를 전혀 변경할 필요가 없으며 표준 파이썬 인터프리터 (Python 2x 또는 3x)보다 약 40 배 빠릅니다. pyCharm Community Edition을 사용하여 코드를 관리하고 좋아합니다.
파이썬으로 코드를 작성하는 것이 언어보다 작업에 더 집중할 수 있다고 생각합니다. 더욱 빨라야하는 경우 Windows, Linux 또는 Mac 용 바이너리로 컴파일 할 수 있습니다. 내 경험상, 컴파일 할 때 PyPy보다 약 3.5 배의 속도가 향상되어 파이썬보다 140 배 빠릅니다. PyPy는 Python 3x 및 2x 코드에서 사용할 수 있으며 PyCharm과 같은 IDE를 사용하는 경우 PyPy, Cython 및 Python간에 매우 쉽게 상호 교환 할 수 있습니다 (초기 학습 및 설정이 약간 필요함).
어떤 사람들은 이것에 대해 나와 논쟁 할 수도 있지만 PyPy가 Cython보다 빠릅니다. 그러나 그들은 둘 다 훌륭한 선택입니다.
편집 : 컴파일에 대한 또 다른 빠른 참고 사항을 작성하고 싶습니다. 컴파일 할 때 결과 바이너리는 파이썬 스크립트보다 훨씬 더 큽니다.하지만 모든 의존성을 빌드하는 등 속도가 빠릅니다. 이제 응용 프로그램은 파이썬이나 라이브러리가없는 모든 컴퓨터에서 작동합니다 (전부는 아니더라도 컴파일 한 OS에 따라 다름). 또한 코드를 난독 화하고 기술적으로 '생산'준비입니다 (어느 정도). 일부 컴파일러는 또한 C 코드를 생성하는데, 이것이 유용하거나 단순한 횡설수설인지 실제로 보거나 보지 못했습니다. 행운을 빕니다.
희망이 도움이됩니다.
나는 아주 새로운 해결책에 대한 답이 없다는 것을 알고 있습니다. 코드에서 Numpy가 사용되면 Pythran을 사용해 보는 것이 좋습니다.
http://pythran.readthedocs.io/
내가 시도한 기능에 대해 Pythran은 매우 좋은 결과를 제공합니다. 결과 함수는 Fortran 코드를 작성하는 것만 큼 빠르며 (또는 약간 느리며) (quite optimize) Cython 솔루션보다 약간 빠릅니다.
Cython과 비교할 때의 이점은 Numpy에 최적화 된 Python 함수에서 Pythran을 사용해야한다는 것입니다. 즉, 루프를 확장하고 루프의 모든 변수에 대해 유형을 추가 할 필요가 없습니다. Pythran은 코드를 분석하는 데 시간이 걸리므로의 작업을 이해해야합니다 numpy.ndarray
.
또한 Numba 또는 다른 프로젝트와 비교하여 (내 지식으로는) 루프를 확장하여 효율적으로 처리 해야하는 적시 컴파일을 기반으로하는 다른 프로젝트와 비교할 때 큰 이점입니다. 그리고 루프가있는 코드는 CPython과 Numpy 만 사용하여 매우 비효율적입니다 ...
Pythran의 단점 : 수업 없음! 그러나 실제로 최적화해야하는 기능 만 컴파일해야하기 때문에 그리 성가신 것은 아닙니다.
또 다른 요점 : Pythran은 OpenMP 병렬 처리를 잘 (그리고 매우 쉽게) 지원합니다. 하지만 mpi4py가 지원되지 않는다고 생각합니다 ...
http://code.google.com/p/py2c/ 는 가능성이있는 것처럼 보입니다. Cython, Shedskin 및 RPython 사이트에서도 언급했으며 C보다 훨씬 빠른 순수 C / C ++로 Python 코드를 변환하고 있는지 확인합니다. / C ++는 Python API 호출로 가득 차 있습니다. 참고 : 시도하지는 않았지만 ..