[python] 파이썬을 기계 코드로 컴파일하는 것이 가능합니까?

파이썬을 (중간 C 표현을 통해) 머신 코드로 컴파일하는 것이 얼마나 가능합니까?

아마도 그것은 파이썬 런타임 라이브러리에 연결될 필요가있을 것이며, 파이썬 자체 인 파이썬 표준 라이브러리의 어떤 부분도 컴파일 (및 링크)되어야 할 것입니다.

또한 표현식의 동적 평가를 원한다면 Python 인터프리터를 번들로 제공해야하지만, 이것을 허용하지 않은 Python의 하위 세트는 여전히 유용 할 것입니다.

속도 및 / 또는 메모리 사용 이점을 제공합니까? 아마도 파이썬 인터프리터의 시작 시간이 제거 될 것입니다 (공유 라이브러리는 여전히 시작시로드해야하지만).



답변

ShedSkin Python-to-C ++ 컴파일러를 사용해보십시오 .하지만 완벽하지는 않습니다. 또한 속도 향상 만 필요한 경우 Psyco-Python JIT가 있습니다. 그러나 IMHO는 노력할 가치가 없습니다. 코드의 속도에 중요한 부분은 C / C ++ 확장으로 작성하는 것이 가장 좋습니다.


답변

@Greg Hewgill이 말했듯이 이것이 항상 가능하지 않은 이유는 충분합니다. 그러나 특정 알고리즘 (예 : 매우 알고리즘적인 코드)을 “실제”기계 코드로 변환 할 수 있습니다.

몇 가지 옵션이 있습니다.

  • 머신 코드를 동적으로 방출하는 Psyco를 사용하십시오 . 하지만 변환 할 메소드 / 함수를 신중하게 선택해야합니다.
  • 사용 사이 썬 Python-이며, 같은 파이썬 C 확장으로 컴파일 언어
  • RPython ( Python의 가장 “동적”기능을 지원하지 않는 Python 의 제한된 서브 세트 )에서 C 또는 LLVM으로 의 변환기가있는 PyPy를 사용하십시오 .

    • PyPy는 여전히 실험 중입니다
    • 모든 확장이 존재하지는 않습니다

그런 다음 기존 패키지 중 하나 (freeze, Py2exe, PyInstaller)를 사용하여 모든 것을 하나의 바이너리에 넣을 수 있습니다.

대체로 귀하의 질문에 대한 일반적인 답변은 없습니다. 성능이 중요한 Python 코드가 있다면 가능한 한 많은 내장 기능을 사용하십시오 (또는 “Python 코드를 더 빨리 만드는 방법”질문). 그래도 도움이되지 않으면 코드를 식별하고 C (또는 Cython)로 이식하고 확장을 사용하십시오.


답변

py2c ( https://github.com/pradyun/Py2C )는 파이썬 코드를 c / c ++로 변환 할 수 있습니다. 나는 py2c의 솔로 개발자입니다.


답변

PyPy 는 구현 전략 (JIT가있는 VM, JVM을 사용하는 VM 등) 중 하나로 네이티브 코드로 컴파일을 사용하여 Python에서 Python을 다시 구현하는 프로젝트입니다. 컴파일 된 C 버전은 평균적으로 CPython보다 느리지 만 일부 프로그램의 경우 훨씬 빠릅니다.

Shedskin 은 실험적인 Python-to-C ++ 컴파일러입니다.

Pyrex 는 Python 확장 모듈을 작성하기 위해 특별히 설계된 언어입니다. 훌륭하고 사용하기 쉬운 Python의 세계와 지저분한 저수준의 C 세계 사이의 격차를 해소하도록 설계되었습니다.


답변

Nuitka 는 libpython과 연결되는 Python to C ++ 컴파일러입니다. 비교적 새로운 프로젝트 인 것 같습니다. 필자 는 pystone 벤치 마크에서 CPython보다 속도가 향상 되었다고 주장합니다 .


답변

이것은 언뜻보기에는 합리적으로 보일 수 있지만 Python에는 많은 Python 런타임 지원을 수행하지 않고 C 표현에 직접 매핑 할 수없는 많은 평범한 것들이 있습니다. 예를 들어, 오리 타이핑이 떠 오릅니다. 입력을 읽는 파이썬의 많은 함수 는 특정 연산을 지원 하는 한 파일 이나 파일과 같은 객체를 취할 수 있습니다 . read () 또는 readline (). 이 유형의 지원을 C에 매핑하는 데 무엇이 필요한지 생각하면 Python 런타임 시스템이 이미 수행하는 작업을 정확하게 상상하기 시작합니다.

파이썬 프로그램과 런타임을 단일 실행 파일로 묶을 수있는 py2exe 와 같은 유틸리티가 있습니다 (가능한 한).


답변

Pyrex 는 Python에 대한 목록 이해 를 처음 만든 사람이 C로 컴파일하는 Python 언어의 하위 집합입니다 . 주로 래퍼 작성을 위해 개발되었지만보다 일반적인 상황에서 사용할 수 있습니다. Cython 은 파이렉스의보다 적극적으로 유지되는 포크입니다.