왜 파이썬이 현대 Javascript 구현처럼 최적화되지 않았습니까? 여러 최적화 기능이

V8 (Chrome), SpiderMonkey (Firefox) 및 Chakra (IE / Edge)와 같은 최신 Javascript 구현에는 모두 JIT 컴파일 및 성능 향상을위한 기타 여러 최적화 기능이 있습니다.

왜 파이썬에는 이것들이 없습니까?

나는 PyPy와 IronPython을보고 있는데, 둘 다 속도 향상을 주장합니다. PyPy 해석 언어 인 Python으로 작성된 Python 구현이 C의 참조 구현보다 어떻게 빠를 지 이해하지 못합니다. IronPython도 같은 생각이지만 .NET Framework의 속도가 어떻게 향상되는지는 알지 못합니다.



답변

왜 파이썬에는 이것들이 없습니까?

성능에 관심이있는 Python 구현이 없다고 생각하는 이유를 모르겠습니다. PyPy , IronPythonJython 은 모두 성능을 염두 에두고 산업적으로 강력하고 생산 준비가 된 Python 구현입니다. Pyston특히 성능을 위해 개발 된 개발 중 구현입니다 . Unladen SwallowPsyco 는 Python의 성능을 향상시키기위한 프로젝트였습니다.

그러나 CPython 사용자 가 다른 모든 구현 의 총 통합 사용자 수보다 훨씬 많으며 Unladen Swallow가 커뮤니티에 의해 거부되었다는 사실은 이러한 프로젝트의 대부분이 죽었거나 개발자를 유치하기 위해 고심하고 있습니다. 커뮤니티는 성과를 중시합니다.

이 답변 은 Python 커뮤니티의 일반적인 사고 방식의 좋은 예입니다. 성능 문제를 해결하는 대신 Python이 아닌 코드를 작성하는 것을 선호합니다.

나는 PyPy와 IronPython을보고 있는데, 둘 다 속도 향상을 주장합니다. PyPy 해석 언어 인 Python으로 작성된 Python 구현이 C의 참조 구현보다 빠른 방법을 이해하지 못합니다.

첫째로 : 그것은 컴파일러가 작성된 언어를 중요하지 않습니다 결국, 컴파일러는 실행됩니다. 한 번 그렇게 심지어 경우에 그것은 중요하지 않습니다 즉, 느린했다 : 컴파일러의 성능이 무관하다, 무슨 관련이 컴파일러 의 출력 성능입니다 .

둘째, 컴파일러 의 출력 속도가 중요 하고 컴파일러는 파이썬으로 작성됩니다. 즉, 컴파일하는 언어이므로 실제로 컴파일 하여 스스로를 빠르게 만들 수 있습니다.

셋째, “통역 된 언어”와 같은 것은 없습니다. 언어는 일련의 수학 규칙 및 제한 사항입니다. 사양입니다. 한 장의 종이. 언어는 컴파일되거나 해석되지 않습니다. 언어 입니다. 컴파일과 해석은 언어 구현의 특성이며 ,보다 정확하게 는 언어가 아닌 컴파일러 또는 해석기 (duh!)입니다. 모든 언어는 컴파일러로 구현할 수 있습니다. 모든 언어는 통역사가 구현할 수 있습니다. 인터프리터에서 컴파일러와 컴파일러에서 인터프리터를 기계적으로 생성 할 수 있습니다.

그러나 PyPy는 실제로 파이썬으로 작성 되지 않았기 때문에이 모든 것이 실제로 중요하지 않습니다 . RPython 으로 작성되었습니다 . RPython은 RPython 프로그래밍 언어 와 RPython 프레임 워크 의 두 부분으로 구성됩니다 .

RPython 프로그래밍 언어는 Python 이 아닙니다 . 다른 프로그래밍 언어입니다. RPython은 정적으로 유형이 지정된 프로그래밍 언어이며, 대략 C와 거의 동일한 성능으로 Java와 거의 동일한 수준에 있습니다. RPython은 구문 및 의미 론적 Python의 하위 집합입니다. 즉, 모든 RPython 프로그램은 유효한 Python 프로그램이므로 파이썬 구현에 의해 실행됩니다 (일반적으로 수십 배 느리지 만, 이것은 모든 파이썬 도구에 액세스 할 수 있고 해석이 즉시 시작되기 때문에 디버깅에 여전히 유용하지만 언어 구현을 컴파일하는 데 일반적으로 약 5-10 분이 소요됩니다 ), 그러나 그 반대는 사실이 아닙니다.

RPython 프레임 워크는 RPython 프로그래밍 언어로 고성능 동적 언어 구현을 작성하기위한 프레임 워크입니다. 가비지 콜렉터, 오브젝트 공간, 메타 오브젝트 프로토콜, 사전 정의 된 오브젝트, 유형 및 조작 등이 포함됩니다. 그러나 크라운 주얼리는 인터프리터에서 JIT 컴파일러를 자동으로 생성하는 기능입니다. RPython 프레임 워크에서 언어를 구현하는 경우 인터프리터 만 작성하면 RPython 프레임 워크가 JIT를 처리합니다.

PyPy뿐만 아니라 RPython 플랫폼에는 많은 언어 구현이 있습니다 .

IronPython도 같은 생각이지만 .NET Framework가 어떻게 속도를 높일 지 모르겠습니다.

Microsoft의 다양한 .NET 변형 또는 Mono와 같은 대부분의 ISO CLI 구현에는 정교한 가비지 수집기, 최적화 프로그램 및 컴파일러가 포함되어 있습니다. 자이 썬과 자바 구현에서도 마찬가지이다.

IronPython은 컴파일러이며 Python 소스 코드를 DLR 트리 (DLR은 동적 언어 런타임)로 컴파일 한 다음 CIL 바이트 코드로 추가 컴파일 된 후 다시 기본 머신 코드로 다시 컴파일됩니다.


답변

V8 (Chrome), SpiderMonkey (Firefox) 및 Chakra (IE / Edge)와 같은 최신 Javascript 구현에는 모두 JIT 컴파일 및 성능 향상을위한 기타 여러 최적화 기능이 있습니다.

왜 파이썬에는 이것들이 없습니까?

JavaScript는 웹 브라우저에 포함되어 있으며 오늘날 많은 소프트웨어가 웹 브라우저에서 실행되도록 설계되었습니다. 이는 JavaScript 성능을 매우 중요하게하여 Google, Apple 및 Microsoft와 같은 회사에서 JavaScript 런타임을 빠르게 만드는 데 많은 리소스를 투자합니다. 이 돈의 흐름이 파이썬으로 재 지정 되었다면, 그것은 똑같이 빠를 것입니다.

PyPy 해석 언어 인 Python으로 작성된 Python 구현이 C의 참조 구현보다 빠른 방법을 이해하지 못합니다.

일단 코드가 JIT-ed되면 더 이상 “해석”되지 않는다는 아이디어가 있습니다. PyPI는 Python 코드를 기계 코드 (예 : x86_64 기계 코드)로 변환 한 다음 프로세서에서 직접 실행됩니다.


답변

python 코드를 메인 python 파일로 간단한 최상위 레벨 시작으로 모듈로 구성하면 (코드가 거의 없음) python은 나머지 코드를 모두 기계 독립적 인 바이트 코드로 컴파일합니다. 디렉토리 구조에 표시되는 .pyc 파일 이렇게하면 첫 실행 후 로딩 및 해석 시간이 최소화됩니다.

-O 또는 -OO 플래그를 사용하여 스크립트를 시작하거나 PYTHONOPTIMIZE를 0보다 큰 값으로 설정하면 .pyo 파일이 생성되어 더욱 최적화됩니다.

특정 함수에 대해 높은 최적화가 필요한 경우 C, C ++, FORTRAN 또는 GO로 작성한 다음 파이썬 내에서 사용할 수 있습니다.