왜 파이썬이 Java보다 느리지 만 PHP보다 빠릅니까?


17

주어진 작업에서 여러 언어가 수행되는 방식을 보여주는 다양한 벤치 마크를 여러 번 보았습니다.

이 벤치 마크는 항상 Python이 Java보다 느리고 PHP보다 빠르다는 것을 보여 주며 왜 그런지 궁금합니다.

  • 가상 머신 내에서 Java, Python 및 PHP 실행
  • 세 언어 모두 프로그램 이 OS 위에서 실행 되는 사용자 정의 바이트 코드로 변환 되므로 기본적으로 실행되는 것은 없습니다.
  • Java와 Python은 모두 "컴파일"될 수 있지만 ( .pycPython의 경우) __main__Python 용 모듈은 컴파일되지 않습니다

파이썬과 PHP는 동적으로 입력되며 Java는 정적으로-이것이 Java가 더 빠른 이유이므로 속도에 어떤 영향을 미치는지 설명하십시오.

그리고 dynamic-vs-static 인수가 정확하더라도 PHP가 Python보다 느린 이유를 설명하지 못합니다. 둘 다 동적 언어이기 때문입니다.

여기여기 , 여기에 몇 가지 벤치 마크가 있습니다.


Python과 PHP의 경우 : 구현 품질 문제 일 가능성이 높습니다.
Charles Salvia

8
@good_computer 대부분의 벤치 마크는 매우 잘못되었습니다. 그것을 검토 한 대부분의 사람들이 그것이 "가장 빠르다"고 주장하는 언어가 단순히 가장 최적화 된 코드를 가지고 있다고 불평하는 또 다른 최근 (당신이 연결하지 않았다고 생각합니다)이있었습니다. 이것은 일반적으로 "느린"것으로 간주되는 언어에 익숙하지 않은 사람에 의해 무의식적으로 수행되므로 "빠른"것으로 밝혀진 언어로 더 나은 코드를 작성하고 있다는 것을 인식하지 못합니다.
이즈 카타

@good_computer 귀하의 질문에 " 항상 이러한 벤치 마크는 Python이 Java보다 느리고 PHP보다 빠르며 ", " PHP는 Python보다 느리다는 것을 나타 냅니다. 이러한 인용문을 제거하고 질문을 언어와 무관하게 표현하면 다시 열 수 있습니다.
briddums

이 질문은 정말 바이어스 : (1) 언어 초보 프로그래머에 의해 쓰여진 매우 순진 비 최적화 된 코드를 실시 신뢰할 수없는 벤치 마크 (각각의 주석 스레드에서 해부로)과 (2) 오해에 내장 된 그들은 주인을하지 않는 참조 해석 된 / 바이트 코드 언어 (php / python은 해석되고, 자바의 바이트 코드는 python 캐시 파일은 바이트 코드가 아닌 추상 구문 트리입니다) 와 세 언어의 상태 (파이썬과 php의 컴파일 된 버전이 있습니다-파이썬은 더 성숙하고 컴파일됩니다) PHP는 페이스 북을 실행합니다)
ZJR

답변:


26

JVM 코드는 사소한 (빠른) 임시 컴파일러를 사용하여 효율적으로 JIT 컴파일 될 수 있습니다. 그러나 동적으로 유형이 지정되어 있기 때문에 PHP와 Python에서도 예외적으로 어렵습니다. JVM은 C ++ 컴파일러가 생성하는 것과 매우 비슷한 수준의 간단한 기본 코드로 변환되지만 동적 언어의 경우 문자 그대로 모든 기본 작업과 모든 메소드 호출에 대해 동적 디스패치를 ​​생성해야합니다. 이 동적 디스패치는 이러한 종류의 모든 언어에 대한 주요 병목 현상입니다.

경우에 따라 훨씬 더 복잡한 추적 JIT 컴파일러를 사용하여 동적 디스패치 (Java의 가상 호출)를 제거 할 수 있습니다. 이 접근법은 아직 초기 단계에 있으며 추상 해석을 너무 많이하지 않으며 그러한 컴파일러는 질식 할 수 있습니다.eval 동적 언어에 매우 일반적인 호출 있습니다.

파이썬과 PHP의 차이점은 후자의 품질이 훨씬 낮습니다. 이론 상으로는 더 빠를 수는 있지만 결코 그렇지 않습니다.


1
동적 언어에서 JIT가 "예외적으로"어려운 이유는 무엇입니까? JavaScript 세계에서 v8 또는 TraceMonkey를 살펴보십시오 .JIT가 제대로 작동합니다.
treecoder

6
@good_computer, JIT 추적은 일반적인 임시 JIT보다 훨씬 복잡하며 정적으로 유형이 지정된 언어의 JIT보다 훨씬 느리게 수행됩니다. 적절한 추적 JIT에는 완전한 추상 해석이 포함되며 각 eval호출 마다 질식합니다 .
SK-logic

2
백 정도 :-)은 "사소한"부분에 대해 동의하지 않을 것입니다 오라클 핫스팟 컴파일러 팀 내부 엔지니어 거기에 아마
요 르그 W MITTAG

1
@ JörgWMittag는 물론 HotSpot은 그다지 간단하지 않고 약간의 정적 분석을 수행하며 런타임 프로파일 링 결과를 사용하지만 여전히 적절한 추적 JIT보다 훨씬 간단합니다. 그리고, HotSpot은 지나치게 복잡하며, 그 구현은 정중하게 표현하기에는 너무 장황합니다.
SK-logic

1
동적 언어에 대한 임시 JIT 인 @Frank Shearar는 정적으로 유형이 지정된 것만 큼 간단합니다 (예 : LuaJIT 참조). 효율적인 JIT 인 OTOH는 완전히 다릅니다.
SK-logic

21

이 질문에는 너무 절대적이라는 점에서 일반적인 문제가 있습니다. "언어 X가 언어 Y보다 빠릅니다"라고 말하는 것은 실제로 의미가 없습니다. 컴퓨터 언어 자체는 단지 알고리즘을 표현하는 방법이기 때문에 "빠르거나"느리지 않습니다. 실제 질문은 "특정 문제 도메인에 대해 언어 X의 구현 X1이 언어 Y의 구현 Y1보다 왜 빠른가?"와 같은 순서 여야합니다.

특정 언어는 다른 언어보다 특정 도메인을 구현하기가 더 쉬우므로 일부 속도 차이는 확실히 언어 자체에서 벗어날 것입니다. 그러나 구현을 빠르게하는 것은 언어가 아닙니다. 예를 들어 CPython, IronPython 또는 PyPy에 대해 이야기하고 있는지 여부를 고려하지 않고 실제로 "Python이 Java보다 느립니다"라고 말할 수 없습니다. 속도는 VM의 품질에 직접적인 영향을 받기 때문에 VM을 사용하는 언어의 경우 특히 그렇습니다.

제쳐두고, 나는 여러 가지 이유로 시스템을 지원하는 매우 인기있는 JavaScript VM이있는 장치에서 JIT를 사용할 수없는 시스템을 사용합니다. 이것은 우리의 JavaScript가 유사한 프로세서를 가진 PC에서보다 훨씬 느리게 실행됨을 의미합니다. 언어 자체와 직접 관련이없는 한 가지 변경 사항으로 인해 JavaScript는 "C ++보다 몇 배 느리게"에서 우리가 관심을 갖는 작업에 대해 "C ++보다 훨씬 느린 속도"로 변경됩니다.

또한 언어는 직접 비교할 수없는 방식으로 성능 특성이 다릅니다. 벤치 마크가 너무 많으면 프로그램을 언어 A에서 언어 B로 변환하기 때문에 언어가 다른 기능이 빠르다는 점을 고려하지 않습니다. (언어를 Foo로 구현하는 방법을 보여줘서 고마워요.

예를 들어, 다음 Java 코드를 사용하십시오.

for(int i=0;i<10;i++) {
    Object o = new Object;
    doSomething(o);
}

C ++에서 이것을 "재 작성"하고 런타임을 비교하려는 유혹이있을 것입니다.

for(int i=0;i<10;i++) {
    Object *o = new Object;
    doSomething(o);
    delete(o);
}

문제는 유능한 C ++ 프로그래머가 C ++에서 이것이 가장 빠른 방법은 아니라는 것을 즉시 알 수 있다는 것입니다. C ++에 더 적합하도록 변경하여 작업 속도를 쉽게 높일 수 있습니다.

for(int i=0;i<10;i++) {
    Object o;
    doSomething(&o);
}

요점은 C ++가 빠를 수는 없지만 언어를 비교하기 위해 벤치 마크를 작성하는 것이 실제로는 정말 어렵다는 것입니다. 제대로하려면 두 언어 모두 전문가 여야하며 두 언어로 처음부터 작성해야합니다. 그럼에도 불구하고 특정 작업에서 한 언어가 뛰어난 영역에 쉽게 접근 할 수 있습니다. 예를 들어, 합리적인 컴파일러에서 Java보다 빠르게 실행되는 C ++에서 하노이 타워 버전을 작성할 수 있습니다. 컴파일 타임에 평가 된 C ++ 템플릿을 사용하여 본질적으로 부정 행위를함으로써 그렇게 할 수 있습니다 (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)

요점은 Java 버전이 몇 분 동안 실행되는 동안 내 프로그램이 즉시 반환 되었기 때문에 "C ++이 Java보다 빠릅니다"라고 말할 수는 없습니다. 좁은 경우에 따라 C ++이 더 빠릅니다. 다른 좁은 경우에는 다른 방법 일 수 있습니다. 따라서 "C ++이 빠릅니다"가 아니라 "템플릿을 사용하여 빌드 타임에 표현식을 평가할 수있는 경우 C ++이 빠릅니다." 덜 만족하지만 사실입니다.

언어의 속도 차이는 주로 구현에 관한 것입니다. 컴파일 된 언어는 해석 된 언어보다 빠를 것입니다. 바이트 코드로 컴파일하는 것보다 원시 코드로 컴파일하는 것이 더 빠릅니다. 이것은 언어가 정적으로 타이핑되는지 아닌지와 같은 질문보다 훨씬 더 효과적입니다. 물론 좋은 구현은 나쁜 구현보다 빠를 것입니다.

또한 훌륭한 프로그래머가 나쁜 프로그래머보다 빠른 코드를 생성한다는 사실을 잊지 마십시오. 언어 차이보다 훨씬 더 큽니다.


6

그것은 컴파일러의 품질과 관련이 있으며, java의 컴파일러는 훨씬 더 오랫동안 지속적으로 최적화되었으며 모든 코드가 Java로 컴파일되기 때문에 최적화가 더 중요합니다. 파이썬이 PHP보다 빠르다는 정확한 이유는 확실하지 않지만 구글이 파이썬에 영향을 미치기 때문에 내기 할 것입니다.


8
이것이 왜 하향 조정 되었습니까? 이것이 바로 정답입니다. 성능은 전적으로 연구 및 엔지니어링 노력의 문제이므로 궁극적으로 돈입니다. Java 구현을 생성하는 회사는 Python 또는 PHP 구현을 생성하는 회사보다 훨씬 풍부합니다. 그게 다야.
Jörg W Mittag

1
또한 CPython 최적화가 코드를 읽기 어렵게 만들고 성능을 약간만 향상시키는 경우 허용되지 않습니다.
cgt

2
+ Jörg W Mittag : 동의하지 않습니다. 일부 언어 기능은 성능 적으로 구현하기가 매우 어려울 수 있으므로 효율적인 구현 작성을 매우 어렵거나 불가능하게 만듭니다. 다른 한편으로, "어셈블러"언어의 "효율적인"구현을 만드는 것은 간단합니다.
user281377

@ammoQ 나는 많은 것들이 타입 시스템, 특히 어떤 타입을 가지고 있는지, 그리고 허용 가능한 연산의 정확한 의미가 무엇인지 정확히 아는 능력에 기인한다고 생각합니다. 동적 언어는 그 특성상 유연성을 얻지 만 형식 증명을 수행하기 어렵고 안전한 초고속 코드로 컴파일하기가 어렵습니다.
Donal Fellows

1
@DonalFellows 정확히 내 생각. 컴파일 타임에 알려진 것이 적을수록 런타임 동안 더 많은 것을 알아 내야합니다.
user281377

4

Java가 가장 빠른 이유 :

정적으로 입력 된 + JIT compile + --server 플래그는 실행중인 코드를 적극적으로 다시 컴파일합니다.

파이썬이 PHP보다 빠른 이유 :

파이썬은 역동적 인 언어 일지 모르지만 여전히 강력하게 타이핑되어 있습니다. 이는 코딩하는 구조가 런타임 최적화가 가능하다는 것을 의미합니다.

PHP가 짜증나는 이유 :

기본적으로 서버의 자바 스크립트입니다 (멀티 스레딩 지원 없음, 완전히 동적이며 느슨하게 입력 됨).

본질적으로 컴파일러가 코드에 대해 더 많이 알수록 더 많이 최적화 할 수 있습니다. Java는 실행하기 전과 실행되는 동안 완전히 최적화 할 수 있습니다. 파이썬은 실행 중 최적화가 가능하며 PHP는 끔찍합니다. 페이스 북은 실제로 서버에 들어가기 전에 PHP를 C로 변환합니다.
https://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/


실제로 서버의 Javascript는 Node.JS이며 내가 이해하는 것 (이 사실을 입증하지는 못하지만) V8 엔진은 일반적으로 PHP보다 성능이 뛰어납니다 (아마 톤은 아님). 또한 파이썬을 네이티브로 컴파일 할 수 있음을 언급해야합니다 (Java와 비교하여 어떻게 수행합니까?)
Jimmy Hoffa

나는 파이썬을 광범위하게 사용하지 않았지만 V8을 실행하는 nodejs는 네이티브 C 확장 기능을 지원한다고 말할 수 있습니다 (JS / C 경계를 넘기는 것은 느린 것으로 생각되지만), Google의 JIT 컴파일러를 활용할 수 있습니다. .. 노드가 파이썬과 PHP보다 빠르면 놀라지 않을 것입니다. 다음은 벤치 마크입니다 (대부분의 경우 결함이 있음). blog.famzah.net/2010/07/01/… 주석 작성자가 벤치 마크에서 결함을 지적 할 때까지 자바가 JS보다 느리게 보였습니다. 소금. :)
Ajax

즉, node와 php는 모두 단일 스레드이며, haproxy와 같은 클러스터 프록시 설정을 좋아하지 않는 한 심각한 프로덕션 환경에서는 두 가지 중 하나를 만지지 않습니다.
Ajax

1

벤치 마크는 많은 수학적 프로그래밍을 선호하기 때문에 다소 왜곡됩니다.

파이썬이 처음 어디에서 왜 작성 되었는지 고려하면 복잡한 수학에 능숙하다는 것은 놀라운 일이 아닙니다. .

반면에 PHP는 웹 페이지를 제공하기 위해 작성되었지만 다른 작업을 수행 할 수 있지만 웹 페이지는 이 작업에서 Java보다 우수 하거나 이상으로 우수 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.