Python 프로그램을 C / C ++ 코드로 변환 하시겠습니까? [닫은]


149

파이썬 프로그램을 C / C ++로 변환 할 수 있습니까?

몇 가지 알고리즘을 구현해야하며 C / C ++에서 내가 할 때 겪는 모든 고통을 정당화하기에 성능 격차가 충분히 큰지 확실하지 않습니다 (잘 모르겠습니다). 하나의 간단한 알고리즘을 작성하고 그러한 변환 된 솔루션에 대해 벤치마킹했습니다. 그것만으로 파이썬 버전보다 훨씬 빠르면 C / C ++에서 다른 것을 선택할 수 없습니다.


32
파이썬이 벤치 마크에서 잃는 것처럼, 파이썬에서 계산이 몇 초 안에 완료되면 50x 또는 100x 속도 저하는 여전히 무시할 수 있으며 많은 I / O를 수행하거나 끔찍한 알고리즘을 가지고있을 때는 사실이 아닙니다. "파이썬이 얼마나 느려 질까?" "파이썬은 충분히 빠르지?" 솔직히 말해서 벤치마킹이나 요구보다 빠릅니다.

1
파이썬에서 알고리즘을 구현하는 것은 매우 빠르고 간단합니다 ... 간단하게 수행 한 다음 충분히 빠르면 확인하십시오. 대부분의 경우 다른 데이터 구조 (목록 대신 dict / set ...) 또는 다른 작업을 사용하여 알고리즘 을 훨씬 빠르게 실행 하도록 최적화 할 수 있습니다 . 어쨌든 최적화는 알고리즘의 첫 번째 초안을 이미 구현하고 벤치마킹 / 프로파일 한 후에 발생해야 합니다.
Bakuriu

@ delnan : 제 경우에는 계산 시간에 관한 것입니다. C 변형이 x 시간 더 적게 필요하면 알고리즘을 더 오래 / 다시 실행하는 데 그 시간을 투자합니다. 필자는 파이썬이 얼마나 느리게 진행되는지 알고 싶을 뿐이다. 단지 몇 시간 만 지나면 내가 익숙하지 않은 언어를 사용하지 않을 것이다. 피).
CrazyFlyingCloseline

@delnan은 파이썬이 아마도 많은 것들에 대해 충분히 빠를 것이라고 생각합니다. 속도가 느리더라도 개발, 유지 관리 및 향후 향상의 용이성은 고려해야 할 중요한 요소입니다.
martineau

"x 시간"? 이것이 얼마나 큽니까? 구현을 벤치마킹 했습니까? 측정이 있습니까? 구현을 프로파일 링했습니까? 아니면 솔루션을 조기에 최적화하려고합니까?
S.Lott

답변:


115

예. Cython을 보십시오 . 속도 향상을 위해 Python을 C로 변환합니다.


6
물론 많은 cdef선언 을 추가하고 정적 타이핑을 도입 하지 않으면 아무것도 저장하지 않습니다 (그렇지 않으면 불투명 한 PyObject *물건을 저글링합니다 ). 평범한 C만큼 빠르지는 않습니다. 보통 파이썬과 인터페이스하기 때문입니다. 그러나 그 외에는, 예를 들어 꽤 빠르 게 속도를 높일 수 있습니다.

7
@delnan : 사실, 그것은 당신에게 무언가를 저장합니다. 대부분의 순수한 파이썬 코드는 컴파일 후에 더 빠릅니다. 그러나 cdef와 정적 타이핑을 사용하면 실제로 차이점이 보이기 시작합니다. 그리고 파이썬과의 인터페이스는 파이썬에서 C를 사용하는 모든 경우에 발생합니다.
Lennart Regebro

136

C 변형이 x 시간 더 적게 필요하면 알고리즘을 더 오래 / 다시 실행하는 데 그 시간을 투자합니다.

여기서 "invest"는 올바른 단어가 아닙니다.

  1. Python에서 작동하는 구현을 빌드하십시오. C 버전을 마치기 전에이 과정을 마치게됩니다.

  2. Python 프로파일 러로 성능을 측정하십시오. 찾은 문제를 해결하십시오. 실제로 올바르게 수행하려면 데이터 구조와 알고리즘을 변경하십시오. C에서 첫 번째 버전을 완료하기 전에이 과정을 마치게됩니다.

  3. 여전히 너무 느리면 잘 디자인되고 신중하게 구성된 Python을 C로 수동으로 변환하십시오.

    가늠자가 작동하는 방식으로 인해 기존 Python에서 두 번째 버전 (기존 단위 테스트 및 기존 프로파일 링 데이터 사용)을 수행하는 것이 C 코드를 처음부터 작성하는 것보다 여전히 빠릅니다.

이 인용문은 중요합니다.

최초 망원경 제조업자를위한 톰슨의 규칙
6 인치 거울을 만드는 것보다 4 인치 거울을 만든 다음 6 인치 거울을 만드는 것이 더 빠릅니다.

빌 맥키 난
왕 연구소


15
엄청난 점수에 관계없이 이것이 어떻게 질문에 대답하는지 알 수 없습니다.
Audrius Meskauskas

29

Shed Skin 은 "제한된 Python-to-C ++ 컴파일러"입니다.


3
Shed Skin의 +1 장점은 유형 유추입니다 . 프로그램 흐름에서 변수 유형을 추측 할 수 있으면 동적 유형 검사를 피할 수 있습니다. 이것은 일반적으로 더 짧은 프로그램을 읽고 컴파일하는 것이 가능한 C ++ 코드를 더 짧게 만듭니다.
Kyss Tao

1
이 또한 파이썬 → 11리터 → C ++ transpiler 또한 C ++ 컴파일러에 제한 파이썬이다,하지만 헛간 스킨이 지원되지 않습니다 일부 파이썬 기능 (예 : 중첩 된 기능 / 폐쇄)를 지원합니다.
tav

17

그냥이 건너 온 해커 뉴스의 새로운 도구.

"Nuitka는 Python 인터프리터를 대체하기에 적합하며 CPython 2.6, 2.7, 3.2 및 3.3이 제공하는 모든 구문을 컴파일합니다. Python을 C ++ 프로그램으로 변환 한 다음"libpython "을 사용하여 동일한 방식으로 실행합니다. CPython은 매우 호환 가능한 방식으로 작동합니다. "


이 프로젝트는 다른 유사한 옵션보다 훨씬 성숙합니다. .exeOSX Mach-O 실행 파일이 완벽하게 작동하지만 OSX 에서 확장 기능을 가진 바이너리를 생성하는 것은 재미 있습니다 . 그것은 같은 외모에 대한 좋은 대체 될 수 pyinstaller, py2exe, py2app, 등 --recurse-***플래그는하지만 제대로 설정하는 것이 중요하다.
ccpizza

Nuitka는 훌륭하지만 생성 된 C / C ++ 코드는 CPython-C 코드 구현에 바인딩되는 PyObject를 사용하고 있습니다. 관용적 C 코드를 생성하지 않습니다.
Make42

8

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 ++로 공격적으로 컴파일하려고 시도합니다.

이 프로젝트는 젊으 며 버그가 발생할 수 있습니다. 또한 개발 팀은 매우 친숙하며 몇 시간 안에 버그를 수정하는 경향이 있습니다.


6

나는 이것이 오래된 스레드라는 것을 알고 있지만 도움이되는 정보라고 생각하는 것을주고 싶었습니다.

나는 개인적으로 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 코드를 생성하는데, 이것이 유용하거나 단순한 횡설수설인지 실제로 보거나 보지 못했습니다. 행운을 빕니다.

희망이 도움이됩니다.


2
나는 이것이 오래된 의견이라는 것을 알고 있지만 감사합니다!
kfrncs

문제 없습니다. 유용해서 다행입니다.
jacktrader

PyPy 해석에서 컴파일 할 때 어떤 소프트웨어를 사용합니까?
Vasyl Vaskivskyi

특히 PyPy가 아니라 .py 스크립트입니다. "C / C ++ 실행 파일 또는 C / C ++ 소스 코드"를 원하는 경우 Nuitka 및 실행 파일 (더 쉬운)을 원하는 경우 PyInstaller. py2exe도 있지만 성공하지는 못했지만 상황이 개선되었다고 확신합니다. PyInstaller는 Windows 실행 파일 (Linux 및 Mac에서 작동)뿐만 아니라 크로스 플랫폼이기도합니다. Nuitka는 이론적으로 더 최적화 할 수있는 유용한 소스 코드를 제공하는 유일한 "컴파일러"라고 생각하기 때문에 독특합니다. bbFreeze, cx_Freeze 및 py2app와 같은 몇 가지가 있지만 시도하지 않았습니다. 행운을 빕니다!
jacktrader

1
PyPy가 Cython보다 빠르게 실행되는 것도 발견했습니다. 한 테스트에서 실제로 PyPy가 C ++ 버전의 프로그램 (삽입 정렬)과 동일한 속도 인 것으로 나타났습니다.
Nv7

5

나는 아주 새로운 해결책에 대한 답이 없다는 것을 알고 있습니다. 코드에서 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가 지원되지 않는다고 생각합니다 ...


4

http://code.google.com/p/py2c/ 는 가능성이있는 것처럼 보입니다. Cython, Shedskin 및 RPython 사이트에서도 언급했으며 C보다 훨씬 빠른 순수 C / C ++로 Python 코드를 변환하고 있는지 확인합니다. / C ++는 Python API 호출로 가득 차 있습니다. 참고 : 시도하지는 않았지만 ..


1
Py2C는 아직 완성되지 않은 프로젝트 인 것 같습니다. 몇 년 동안 업데이트되지 않았으므로 기능이 손상 될 수 있습니다.
앤더슨 그린
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.