Programing

Python 프로그램이 C 또는 C ++로 작성된 동등한 프로그램보다 종종 느린 이유는 무엇입니까?

lottogame 2021. 1. 10. 16:45
반응형

Python 프로그램이 C 또는 C ++로 작성된 동등한 프로그램보다 종종 느린 이유는 무엇입니까?


Python이 평균적으로 C / C ++보다 느리게 보이는 이유는 무엇입니까? 저는 Python을 첫 프로그래밍 언어로 배웠지 만 C로 시작했을 뿐이고 이미 분명한 차이를 느낄 수 있다고 생각합니다.


파이썬은 C보다 높은 수준의 언어입니다. 즉, 메모리 관리, 포인터 등 컴퓨터의 세부 사항을 추상화하고 인간이 생각하는 방식에 더 가까운 방식으로 프로그램을 작성할 수 있습니다.

실행 시간 만 측정하면 일반적으로 C 코드가 Python 코드보다 10 ~ 100 배 빠르게 실행되는 것은 사실입니다. 그러나 개발 시간도 포함하면 Python이 종종 C를 능가합니다. 많은 프로젝트의 경우 개발 시간이 런타임 성능보다 훨씬 더 중요합니다. 개발 시간이 길어지면 추가 비용이 발생하고 기능이 줄어들며 출시 시간이 단축됩니다.

내부적으로 Python 코드가 더 느리게 실행되는 이유는 코드가 컴파일 타임에 네이티브 코드로 컴파일되는 대신 런타임에 해석되기 때문입니다.

표준 배포판에는 런타임시 바이트 코드를 네이티브 코드로 컴파일 하는 JIT 컴파일러포함되어 있기 때문에 Java 바이트 코드 및 .NET 바이트 코드와 같은 다른 해석 언어는 Python보다 빠르게 실행 됩니다. CPython에 JIT 컴파일러가없는 이유는 Python의 동적 특성으로 인해 작성하기가 어렵 기 때문입니다. 작업진행 이 성능 차이는 향후 감소 할 것으로 예상해야하므로 빠른 파이썬 런타임을 쓸 수는 있지만, 표준 파이썬 분포가 강력한 JIT 컴파일러를 포함하기 전에 아마 잠시 될 것입니다.


CPython은 Just in Time 옵티마이 저가 없기 때문에 특히 느립니다 (참조 구현이고 특정 경우 성능보다 단순성을 선택하기 때문입니다). Unladen Swallow 는 LLVM 지원 JIT를 CPython에 추가하고 엄청난 속도 향상을 달성하는 프로젝트입니다. Jython 및 IronPython은 CPython보다 훨씬 빠르며 고도로 최적화 된 가상 머신 (JVM 및 .NET CLR)에 의해 지원 될 수 있습니다.

그러나 틀림없이 Python을 느리게 만드는 한 가지는 동적으로 입력되고 각 속성 액세스에 대한 조회가 많다는 것입니다.

예를 들어 f객체 A__dict__호출하면 에서 ,를 호출하는 __getattr__등의 가능한 조회가 발생하고 마지막으로 __call__호출 가능한 객체를 호출합니다 f.

동적 타이핑과 관련하여 어떤 유형의 데이터를 다루고 있는지 알고있는 경우 수행 할 수있는 많은 최적화가 있습니다. 예를 들어 Java 또는 C에서 합산하려는 정수 배열이있는 경우 최종 어셈블리 코드는 index에서 값을 가져와 i에 추가 accumulator한 다음 증가 하는 것처럼 간단 할 수 있습니다 i.

파이썬에서는 코드를 최적으로 만들기가 매우 어렵습니다. ints를 포함하는 목록 하위 클래스 객체가 있다고 가정합니다 . 추가하기 전에 Python은를 호출 list.__getitem__(i)한 다음을 호출 하여 "누적 기"에 추가 accumulator.__add__(n)한 다음 반복해야합니다. 다른 스레드가 예를 들어 __getitem__add 또는 getitem 호출 사이에 메서드, 목록 인스턴스의 dict 또는 클래스의 dict를 변경했을 수 있기 때문에 여기에서 수많은 대체 조회가 발생할 수 있습니다 . 로컬 네임 스페이스에서 누산기 및 목록 (및 사용중인 모든 변수)을 찾는 경우에도 dict 조회가 발생합니다. 일부 내장 유형의 경우 다소 완화되지만 사용자 정의 객체를 사용할 때 이와 동일한 오버 헤드가 적용됩니다.

또한 bigint (Python 3에서는 int, Python 2.x에서는 long), list, set, dict 등과 같은 기본 유형이 사람들이 Python에서 많이 사용한다는 점에 주목할 가치가 있습니다. 이미 충분히 최적화 된 이러한 개체에 대한 수많은 내장 작업이 있습니다. 예를 들어, 위의 예 sum(list)에서는 누산기 및 인덱스를 사용하는 대신 호출하면 됩니다. 이것들을 고수하고 int / float / complex로 약간의 숫자 처리를하면 일반적으로 속도 문제가 발생하지 않을 것이며, 그렇게한다면 아마도 작은 시간 결정 단위 (예 : SHA2 다이제스트 함수)가있을 것입니다. C (또는 Jython의 Java 코드)로 이동하기 만하면됩니다. 사실, C 또는 C ++를 코딩 할 때 많은 시간 을 낭비하게됩니다.몇 초 / 한 줄의 Python 코드로 수행 할 수있는 작업을 수행합니다. 나는 당신이 임베디드 또는 실시간 프로그래밍과 같은 것을하고 있고 그것을 감당할 수없는 경우를 제외하고는 트레이드 오프가 항상 가치가 있다고 말하고 싶습니다.


여기서 컴파일과 해석은 중요하지 않습니다. 파이썬 컴파일되고, 사소하지 않은 프로그램에 대한 런타임 비용의 작은 부분입니다.

주요 비용은 다음과 같습니다 : 기본 정수에 해당하는 정수 유형의 부족 (모든 정수 연산을 훨씬 더 비싸게 함), 정적 유형의 부족 (메소드 확인을 더 어렵게 만들고 값 유형을 확인해야 함을 의미 함) 런타임시) 및 unboxed 값의 부족 (메모리 사용량을 줄이고 간접적 인 수준을 피할 수 있음).

이러한 것 중 어느 것도 가능하지 않거나 Python에서 더 효율적으로 만들 수 없다는 것은 아니지만, 런타임 속도보다 프로그래머의 편리함과 유연성, 언어 깔끔함을 선호하도록 선택되었습니다. 이러한 비용 중 일부는 영리한 JIT 컴파일로 극복 할 수 있지만 Python이 제공하는 이점은 항상 약간의 비용이 듭니다.


파이썬과 C의 차이점은 해석 된 (바이트 코드) 언어와 컴파일 된 (원어민으로) 언어의 일반적인 차이입니다. 개인적으로 저는 파이썬이 느리다고 생각하지 않으며 잘 관리됩니다. 물론 영역 밖에서 사용하려고하면 속도가 느려집니다. 그러나이를 위해 시간이 중요한 알고리즘을 네이티브 코드에 넣어 속도를 높이는 Python 용 C 확장을 작성할 수 있습니다.


Python은 일반적으로 스크립팅 언어로 구현됩니다. 즉, 인터프리터를 거치게됩니다. 즉, 처음부터 실행 파일이 모두 기계어로되어있는 것이 아니라 즉시 코드를 기계어로 번역한다는 의미입니다. 결과적으로 코드를 실행하는 것 외에도 코드 번역 비용을 지불해야합니다. CPython의 경우에도 기계 언어에 더 가까운 바이트 코드로 컴파일되므로 더 빨리 번역 할 수 있습니다. Python에는 동적 타이핑과 같은 매우 유용한 런타임 기능도 제공되지만 이러한 기능은 일반적으로 많은 런타임 비용 없이는 가장 효율적인 구현에서도 구현할 수 없습니다.

셰이더 작성과 같이 프로세서 집약적 인 작업을 수행하는 경우 Python이 C ++보다 약 200 배 느린 경우가 드물지 않습니다. CPython을 사용하면 그 시간을 절반으로 줄일 수 있지만 여전히 빠르지 않습니다. 그 모든 런트 미 케이크에는 대가가 따릅니다. 이를 보여주는 많은 벤치 마크가 있으며 여기 에 특히 좋은 벤치 마크가 있습니다. 첫 페이지에서 인정했듯이 벤치 마크에는 결함이 있습니다. 그들은 모두 자신이 선택한 언어로 효율적인 코드를 작성하기 위해 최선을 다하는 사용자에 의해 제출되었지만 좋은 일반적인 아이디어를 제공합니다.

효율성이 걱정된다면 두 가지를 함께 혼합 해 보는 것이 좋습니다. 그러면 두 가지 장점을 모두 얻을 수 있습니다. 저는 주로 C ++ 프로그래머이지만 많은 사람들이 그렇게하는 것이 귀찮을 때 (컴파일 시간이 하나의 예로서) C ++로 평범하고 높은 수준의 코드를 너무 많이 코딩하는 경향이 있다고 생각합니다. 스크립팅 언어를 금속에 가까운 C / C ++와 같은 효율적인 언어와 혼합하는 것은 프로그래머 효율성 (생산성)과 처리 효율성의 균형을 맞추는 방법입니다.


C / C ++를 Python과 비교하는 것은 공정한 비교가 아닙니다. F1 경주 용 자동차를 유틸리티 트럭과 비교하는 것과 같습니다.

What is surprising is how fast Python is in comparison to its peers of other dynamic languages. While the methodology is often considered flawed, look at The Computer Language Benchmark Game to see relative language speed on similar algorithms.

The comparison to Perl, Ruby, and C# are more 'fair'


Other than the answers already posted, one thing is pythons ability to change things in runtime that you can't change in for example C. You can add member functions to classes as you go. Also, pythons dynamic nature makes it impossible to say what type of parameters will be passed to a function, which in turn makes optimizing a whole lot harder.

RPython seems to be a way of getting around the optimization problem.

Still, it'll probably won't be near the performance of C for numbercrunching and the like.


C and C++ compile to native code- that is, they run directly on the CPU. Python is an interpreted language, which means that the Python code you write must go through many, many stages of abstraction before it can become executable machine code.

ReferenceURL : https://stackoverflow.com/questions/3033329/why-are-python-programs-often-slower-than-the-equivalent-program-written-in-c-or

반응형