왜 파이썬 코드를 컴파일해야합니까?


241

왜 파이썬 스크립트를 컴파일하겠습니까? .py 파일에서 직접 실행할 수 있으며 제대로 작동하므로 성능상의 이점이 있습니까?

또한 내 응용 프로그램의 일부 파일은 .pyc로 컴파일되는 반면 다른 파일은 그렇지 않은 이유는 무엇입니까?


또한 회사 비밀 인 경우 코드를 공유 할 수없는 경우 응용 프로그램의 빠른 시작을 포함하여 보안도 향상됩니다.
Please_Dont_Bully_Me_SO_Lords

@PSyLoCKe 당신은 정말로, 정말로하지 않습니다. 파이썬 바이트 코드는 컴파일러가 그것을 최적화하기 위해 난독 화 할 필요가 없기 때문에 실제로 읽을 수 있습니다. (그것이 그것을 많이 최적화하지는 않습니다 ...)
wizzwizz4

1
일부 파일이 자동으로 컴파일되는 이유는 파일을 가져 오기 때문입니다. 예를 import mylib.py들어을 사용 하면 Python은 컴파일 mylib.py되어 미래의 import명령문이 조금 더 빨리 실행됩니다. 나중에 변경 mylib.py하면 다음에 가져올 때 다시 컴파일됩니다 (Python은 파일 날짜를 사용하여 이러한 일이 발생 함을 확인합니다)
fyngyrz

답변:


270

바이트 코드로 컴파일되어 훨씬 더 많이 사용할 수 있습니다.

일부 파일이 컴파일되지 않는 이유 python main.py는 스크립트를 실행할 때마다 호출하는 기본 스크립트 가 다시 컴파일되기 때문입니다. 가져온 모든 스크립트는 컴파일되어 디스크에 저장됩니다.

벤 블랭크의 중요한 추가 :

컴파일 된 스크립트를 실행할 때 시작 시간 이 더 빠르지 만 (컴파일 할 필요가 없기 때문에) 더 빨리 실행 되지 않습니다 .


260
컴파일 된 스크립트를 실행할 때 시작 시간 이 더 빠르지 만 (컴파일 할 필요가 없기 때문에) 더 빨리 실행 되지 않습니다 .
Ben Blank

24
일반적인 오해. 공유해 주셔서 감사합니다.
matpie 2019 년

1
컴파일이 필요하지 않은 것 외에도 .pyc 파일은 거의 작습니다. 특히 당신이 많은 의견을 경우. 내 중 하나는 .py는 28419이지만 .pyc는 17879에 불과하므로로드 시간도 좋습니다. 마지막으로 다음과 같은 방법으로 최상위 스크립트를 미리 컴파일 할 수 있습니다. python -m compileall myscript.py
fyngyrz

1
메모리 소비에 차이가 있습니까? 64MB의 RAM으로 밉스 CPU 기반의 임베디드 장치에서 Python을 테스트하고 있으므로 컴파일 된 버전의 Python 스크립트를 시작할 때 메모리 사용에 이점이 있습니까?
valentt

1
@valentt : 아마 아닐 것입니다. 파이썬 내부에 ​​대해서는 잘 모르지만 바이트 코드를 파싱하는 데 파이썬에서 많은 메모리가 필요하다고 생각하지 않습니다. 나는 어떤 상태를 기억하기 위해 많은 기억이 필요한 것을 생각할 수 없습니다.
Georg Schölly

80

.pyc 파일은 이미 바이트 코드로 컴파일 된 Python입니다. Python은 호출 한 .py 파일과 이름이 같은 파일을 찾으면 자동으로 .pyc 파일을 실행합니다.

"파이썬 소개" 컴파일 된 파이썬 파일에 대해 다음과 같이 말합니다 .

'.py'파일에서 읽을 때보 다 '.pyc'또는 '.pyo'파일에서 읽을 때 프로그램이 더 빨리 실행되지 않습니다. '.pyc'또는 '.pyo'파일에 대해 더 빠른 유일한 것은 파일을로드하는 속도입니다.

.pyc 파일을 실행하면 파이썬에서 파일을 컴파일하기 전에 오버 헤드가 발생하지 않아도됩니다. 어쨌든 파이썬은 .py 파일을 실행하기 전에 바이트 코드로 컴파일 할 것이기 때문에 성능 향상이 없어야합니다.

컴파일 된 .pyc 파일을 사용하면 얼마나 향상 될 수 있습니까? 그것은 스크립트가하는 일에 달려 있습니다. "Hello World"를 간단하게 인쇄하는 매우 간단한 스크립트의 경우, 컴파일은 전체 시작 및 실행 시간의 상당 부분을 구성 할 수 있습니다. 그러나 전체 런타임에 비해 스크립트를 컴파일하는 비용은 스크립트를 오래 실행할수록 줄어 듭니다.

명령 줄에서 지정한 스크립트는 .pyc 파일에 저장되지 않습니다. 해당 "주"스크립트에 의해로드 된 모듈 만 해당 방식으로 저장됩니다.


3
많은 경우 차이를 찾기가 어렵지만 30 만 줄이 넘는 특정 파이썬 파일이 있습니다. (테스트를 위해 다른 스크립트에서 생성 한 많은 수학 계산입니다.) 컴파일하는 데 37 초, 실행하는 데 2 ​​초 밖에 걸리지 않습니다.
wojtow

54

플러스 :

첫째 : 온화하고 패배 가능한 난독 화.

둘째 : 컴파일 결과 파일 크기가 훨씬 작아지면로드 시간이 더 빨라집니다. 웹에 좋습니다.

셋째 : 파이썬은 컴파일 단계를 건너 뛸 수 있습니다. 초기로드에서 더 빠릅니다. CPU와 웹에 좋습니다.

넷째, 의견이 많을수록 소스 파일 과 비교 하여 .pyc또는 .pyo파일이 작아집니다 .py.

다섯째 : 파일 .pyc또는 .pyo파일 만 보유한 최종 사용자 는 되돌려지지 않은 변경으로 인해 발생한 버그를 사용자에게 알리기 어렵습니다.

여섯 번째 : 임베디드 시스템을 목표로하는 경우, 더 작은 크기의 파일을 확보하면 상당한 이점을 얻을 수 있으며 아키텍처가 안정적이므로 아래에 설명 된 단점 중 하나가 적용되지 않습니다.

최상위 편집

최상위 파이썬 소스 파일을 다음과 .pyc같은 방식으로 파일로 컴파일 할 수 있다는 것을 아는 것이 유용합니다 .

python -m py_compile myscript.py

주석이 제거됩니다. 그것은 잎 docstrings그대로. 를 제거 docstrings하고 싶다면 (왜 그렇게하고 있는지 진지하게 생각하고 싶을 수도 있음) 대신이 방법으로 컴파일하십시오 ...

python -OO -m py_compile myscript.py

... 그리고 당신은 .pyo파일 대신에 파일을 얻을 것입니다 .pyc; 코드의 필수 기능 측면에서 똑같이 배포 가능하지만 제거 된 크기로 작습니다 docstrings( docstrings처음에 괜찮은 경우 후속 고용에 대해서는 이해하기 쉽지 않음). 그러나 아래의 단점 3을 참조하십시오.

파이썬이 사용하는 참고 .py가 존재하는 경우는, 실행할지 여부를 결정하기 위해, 파일의 날짜를 .py받는 반대로 파일 .pyc이나 .pyo파일을 편집 평 파일 있도록 ---하고, .pyc또는 .pyo무효이며, 어떤 당신이 손실됩니다 얻은 도움이됩니다. 예를 들어 .pyc또는 .pyo이점을 다시 다시 얻으려면 다시 컴파일해야 합니다.

단점 :

첫째 : "매직 쿠키" .pyc.pyopython 파일이 컴파일 된 시스템 아키텍처를 나타내는 파일이 있습니다. 이러한 파일 중 하나를 다른 유형의 환경에 배포하면 파일이 손상됩니다. 당신이 배포하는 경우 .pyc또는 .pyo관련없이 .py재 컴파일 또는 touch그래서는 대체 .pyc또는 .pyo최종 사용자는 하나, 문제를 해결할 수 있습니다.

둘째 : 위에서 설명한 명령 줄 옵션을 docstrings사용하여 건너 뛰면 -OO아무도 해당 정보를 얻을 수 없으므로 코드 사용이 더 어려워 지거나 불가능 해집니다.

셋째 : Python의 -OO옵션은 -O명령 행 옵션에 따라 일부 최적화를 구현합니다 . 작동이 변경 될 수 있습니다. 알려진 최적화는 다음과 같습니다.

  • sys.flags.optimize = 1
  • assert 문을 건너 뜁니다
  • __debug__ = 거짓

넷째 : #!/usr/bin/python첫 번째 줄 의 순서대로 파이썬 스크립트를 의도적으로 실행 가능하게 만들면 이가 제거 .pyc되고 .pyo파일 이 제거 되고 해당 기능이 손실됩니다.

다섯째 : 다소 명백하지만 코드를 컴파일하면 코드의 사용에 영향을 줄뿐만 아니라 다른 사람들이 작업에서 배울 가능성이 줄어 듭니다.


10

컴파일 된 파이썬 실행 성능이 향상되었습니다. 그러나 .py 파일을 가져온 모듈로 실행하면 python은이를 컴파일 및 저장하며 .py 파일이 변경되지 않는 한 항상 컴파일 된 버전을 사용합니다.

파일이 사용될 때 인터페이트 된 언어의 경우 프로세스는 다음과 같습니다.
1. 인터 페치에 의해 파일이 처리됩니다.
2. 파일이 컴파일됩니다.
3. 컴파일 된 코드가 실행됩니다.

분명히 사전 컴파일 된 코드를 사용하면 2 단계를 제거 할 수 있습니다. 이는 파이썬, PHP 및 기타에 적용됩니다.

Heres는 차이를 설명하는 흥미로운 블로그 게시물 http://julipedia.blogspot.com/2004/07/compiled-vs-interpreted-languages.html을
여기 그리고 파이썬 컴파일 과정을 설명하는 항목입니다 http://effbot.org/zone은 /python-compile.htm


9

이미 언급했듯이 파이썬 코드를 바이트 코드로 컴파일하여 성능을 향상시킬 수 있습니다. 이것은 일반적으로 가져온 스크립트에 대해서만 파이썬 자체에서 처리합니다.

파이썬 코드를 컴파일하려는 또 다른 이유는 지적 재산이 복사 및 / 또는 수정되는 것을 방지하기위한 것일 수 있습니다.

이에 대한 자세한 내용은 Python 문서를 참조하십시오 .


2
코드 보호와 관련하여 컴파일하면 많은 도움이되지 않습니다. 난독 화를 컴파일하지만 원하는 사람은 코드에 관계없이 코드를 얻습니다.
Josh Smeaton

1
@josh 항상 충분한 시간을 가지고 메모리에 액세스하거나 CPU에 대한 지침을 볼 수 있다면 앱을 재구성 할 수 있습니다.
UnkwnTech

5
그러나 Unkwntech가 말했듯이, 사람이 충분히 결정되면 항상 가능할 것입니다. 그러나 대부분의 상황에서 사람들이 코드를 "고정"하는 것을 제한하고 싶을 정도로 충분하다고 확신합니다.
Simon B. Jensen

바이트 코드로 컴파일 된 언어는 일반적으로 난독 화를 위해 추가 단계를 수행하지 않는 한 역 컴파일 하기 어렵지 않습니다. 일반적으로 컴파일하는 것만으로는 충분하지 않습니다.
EJoshuaS-복원 Monica Monica

7

컴파일 된 스크립트를 실행할 때 확실히 성능 차이가 있습니다. 일반 .py스크립트 를 실행 하면 컴퓨터는 실행될 때마다이를 컴파일하며 시간이 걸립니다. 현대 컴퓨터에서는 이것이 거의 눈에 띄지 않지만 스크립트가 커짐에 따라 문제가 더 많이 발생할 수 있습니다.


7

다루지 않은 것은 소스-소스-컴파일 입니다. 예를 들어 nuitkaPython 코드를 C / C ++로 변환하고 느린 가상 머신에서 실행되는 Python 바이트 코드 대신 CPU에서 직접 실행되는 이진 코드로 컴파일합니다.

이로 인해 속도가 크게 향상되거나 환경이 C / C ++ 코드에 의존하는 동안 Python으로 작업 할 수 있습니다.


4

컴파일 된 코드를 사용하여 소스 코드에 액세스 할 수없는 사용자에게 배포합니다. 기본적으로 경험이없는 프로그래머가 우연히 무언가를 변경하거나 알려주지 않고 버그를 수정하는 것을 막습니다.


2

그러나 성능이 주된 이유이며 내가 아는 한 유일한 이유입니다.

일부 파일이 컴파일되지 않으면 Python이 디렉토리 권한 또는 무언가 때문에 .pyc 파일에 쓸 수 없습니다. 또는 컴파일되지 않은 파일은로드되지 않습니다 ... (스크립트 / 모듈은 처음로드 될 때만 컴파일됩니다)


1

초보자는 .pyc 파일로 인해 Python이 컴파일되었다고 가정합니다. .pyc 파일은 컴파일 된 바이트 코드이며 해석됩니다. 따라서 이전에 Python 코드를 실행하고 .pyc 파일을 편리하게 사용하면 바이트 코드를 다시 컴파일 할 필요가 없으므로 두 번째로 더 빨리 실행됩니다.

컴파일러: 컴파일러는 고급 언어를 기계 언어로 변환하는 코드입니다.

통역사 : 통역사는 또한 고급 언어를 기계가 읽을 수있는 이진 동등 물로 변환합니다. 인터프리터가 실행될 고급 언어 코드를 얻을 때마다 코드를 기계 코드로 변환하기 전에 코드를 중간 코드로 변환합니다. 코드의 각 부분은 해석 된 다음 순서대로 개별적으로 실행되며 코드의 일부에서 오류가 발견되면 다음 코드 세트를 변환하지 않고 코드의 해석을 중지합니다.

출처 : http://www.toptal.com/python/why-are-there-so-many-pythons http://www.engineersgarage.com/contribution/difference-between-compiler-and-interpreter


9
"컴파일러"정의가 올바르지 않습니다. 컴파일러는 머신 코드로 컴파일하지 않았습니다. 컴파일러는 한 언어에서 다른 언어로의 번역기 일뿐입니다. 그렇기 때문에 파이썬은 바이트 코드로 "컴파일"하고, 커피 스크립트는 자바 스크립트로 "컴파일"하는 방식 등을 말합니다.
Ricky Stewart
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.