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


11

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

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

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


2
IronPython은 다른 .NET 언어와 마찬가지로 매우 성숙한 JIT 컴파일러 구현이 존재하는 Microsoft의 "중급 언어"로 컴파일됩니다.
Doc Brown

2
프로그래밍 언어는 소프트웨어가 아닌 사양 (일부 문서로 작성)입니다. 프로그래밍 언어 구현 만 소프트웨어입니다 (컴파일러 또는 인터프리터 일 수 있음).
바 실레 Starynkevitch

1
@BasileStarynkevitch : 나는 당신 이이 의견으로 우리에게 말하려고하는 것을 얻지 못했습니다. 영업 이익은 CPython과, PyPy와 IronPython의에 대해 명시 적으로 요구하고 있는 특정 파이썬 구현.
Doc Brown

1
@DocBrown 질문의 마지막 단락을 감안할 때 제기 할 관련 요점처럼 보입니다. 이는 파이썬을 해석 언어로 구체적으로 호출 할 때 오해를 보여줍니다.
8bittree

답변:


19

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

성능에 관심이있는 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 바이트 코드로 추가 컴파일 된 후 다시 기본 머신 코드로 다시 컴파일됩니다.


6

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 기계 코드)로 변환 한 다음 프로세서에서 직접 실행됩니다.


3
특히 웹 브라우저 에는 JavaScript에 대한 대안이 없습니다 (또는 적어도 모든 주요 브라우저에서 일반적으로 사용 가능한 것은 없습니다). 웹 브라우저에서 빠른 성능을 원한다면 빠른 JavaScript 구현이 필요합니다. 파이썬을 실행하는 플랫폼에서는 성능이 더 우수한 다른 언어로 이동할 수 있습니다.
8bittree

-3

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

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

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


비 C 확장을 Python에 어떻게 통합합니까? Cython의 C- 확장자 만 알고 있습니다.

1
@Bey : 기본적으로 공유 라이브러리 (.dll 또는 .so)는 함수 시그니처를 알고있는 경우 파이썬에서 호출 할 수 있습니다. 수동으로 구성하거나 스윙과 같은 도구로 생성하거나 doxygen 문서에서 생성 할 수도 있습니다. stackoverflow.com/questions/5811949/… blog.heroku.com/see_python_see_python_go_go_python_go
Steve Barnes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.