2010-07-23 2 views
4

다음 코드는 Python에서 실행하는 데 시간이 오래 걸립니다. (프로그램이 끝날 때까지 기다릴 수는 없었지만 내 친구가 20 분 정도 걸렸다 고 말했습니다.)Python, Java 및 C에서 중첩 루프 비교

Java에서 이와 동등한 코드는 약 8 초 만에 실행되며 C에서는 45 초가 걸립니다.

나는 Python이 느리지 만 많이는 아니지만 Java보다 빠를 것으로 예상되는 C의 경우 실제로 느렸다. 이 속도를 달성하기 위해 JVM이 일부 루프 풀기 기술을 사용하고 있습니까? 파이썬이 너무 느린 이유가 있습니까?

import time 
st=time.time() 
for i in xrange(0,100000): 
    for j in xrange(0,100000): 
     continue; 
print "Time taken : ",time.time()-st 
+0

당신이 최적화를 컴파일하고 있는가? – kennytm

+3

사실, 중첩 루프의 본문이 비어 있기 때문에 C 컴파일러가 시간을 0으로 줄여야합니다. 분명히 C로 컴파일 할 때 모든 옵티 마이저 옵션을 설정하지 않은 것입니다. –

+2

@ S.Lott : 방금 테스트되었습니다. 이미 -O1에있는 GCC가 루프를 제거합니다. 분명히 컴파일러 최적화는 C에서 가능하지 않았고, Java는 항상 켜져있었습니다. – Dummy00001

답변

2

gcc 4.2 이상 -O1 플래그 이상으로 루프를 최적화하면 프로그램에서 1 밀리미터 초를 실행합니다. 이 벤치 마크는 실제 사용과는 거리가 멀기 때문에 그다지 대표적인 것은 아닙니다. 이유 때문에 중첩 루프를 수행 중이며 절대로 비워 두지 마십시오. 파이썬은 왜 기술적 인 이유가 있는지 알지 못하더라도 루프를 최적화하지 않습니다.

파이썬은 기계 언어에서 멀기 때문에 C보다 느립니다. xrange는 훌륭한 추상화이지만 단순한 C 루프에 비해 무거운 머신 코드 레이어를 추가합니다.

C 소스 :

int main(void){ 
     int i, j; 
     for (i=0;i<100000;i++){ 
       for (j=0;j<100000;j++){ 
         continue; 
       } 
     } 
     return 0; 
} 
+1

파이썬 프로그램이 라인 단위로 실행/컴파일된다는 단순한 기술적 인 이유는 아닙니다. 물론 unlimen swallow (http://code.google.com/p/unladen-swallow/)가 마이그레이션 될 때 JIT 컴파일 프로세스가 실제로이를 최적화 할 가능성이 * 높습니다. –

5

파이썬이 느린 것에 대한 어떤 이유가 있나요?

예.

하지만 무엇이 중요합니까? 100,000 개의 xrange 오브젝트를 만들었습니다. 왜? 그게 무슨 상관이야? 실적에 대한 귀하의 진정한 질문은 무엇입니까? 실제로 어떤 알고리즘이 실제로 그렇게 느린가요?


for i in xrange(0,100000): # Creates one xrange object 
    for j in xrange(0,100000): # Creates a fresh xrange object each time through the loop 
+1

@Emil : "u"는 무엇을 의미합니까? "나는"무엇을 의미합니까? 영어를 사용하십시오. 우리 모두는 당신이 사용하는 속기를 읽지 않습니다. –

1

좋은 컴파일러는 루프를 최적화 할 것입니다. 루프를 가정

내가 파이썬 당신의 테스트가 의미있는 측정되지 않는 C 버전

12

보다 느리게 100 배 같은 것으로 기대 멀리 최적화되어 있지 않습니다.

현실 세계에서의 언어 성능은 긴밀한 루프를 실행하는 속도와 거의 관련이 없습니다.

솔직히 나는 C와 Java가 그랬던 것처럼 오래 걸렸다는 사실에 흥미를 느낍니다. 두 컴파일러 모두 내부 루프 내부에서 아무 것도 일어나지 않는다는 것을 깨닫고 양쪽 모두를 존재하지 않는 (0 초) 상태로 최적화했습니다.

반면에 파이썬은 여전히 ​​해석됩니다 (나는 이것에 대해 잘못 될 수 있습니다). 어쨌든 외부 루프가 빈 내부 루프를 실행할 100,000 xrange 개체를 생성해야 할 필요가있는 것처럼 보이며 멀리 떨어져 최적화되지는 않습니다.

그래서 실제 계산 작업이 수행되고 있지 않다는 사실을 알기위한 다양한 컴파일러의 능력이 실제로 측정됩니다. -

+0

+1 : 파이썬은 일반적으로 해석됩니다. C와 비슷한 성능을 발휘할 수있는 Python-to-C 도구가 있습니다. –

+0

@Carl : C는 기본적으로 최적화가 비활성화되어 있습니다. 자바는 기본적으로 활성화되어 있습니다. 예 : GCC는 이러한 루프를 이미 -O1에서 nop으로 만듭니다. – Dummy00001

+0

@Carl 사실 나는 파이썬에서 느린 루프가 얼마나 느린지를 보았을 때 파이썬에서 프로그램을 실행하고있었습니다. prog는 파이썬에서 결과를 보여주기 위해 100 초가 걸렸지 만 C에서는 1-2 초가 걸렸습니다. 이유는 무엇입니까? 위의 코드를 다른 언어로 시도했습니다. – Emil

3
for i in xrange(0, 10000): 
    for j in xrange(0, 10000): 
     pass 

또는

for i in xrange(0, 100000000): 
    pass 

파이썬은 2.6.5 시간 촬영 : 8.50866484642

PyPy 1.3 - 시간 촬영 : 느린 작업의 1.55999398232

이유를하지 않는 창조 xrange 객체

+0

그래서 문제가 될 수 있다고 생각합니까? –

+0

저는 문제가 없다고 생각합니다. 파이썬은 루비, PHP 또는 펄과 같은 "고급 프로그래밍 언어"입니다. 파이썬보다 빨리 php ... 그리고 웹에서 사용하고 싶다면 - 올바른 방법입니다.하지만 OS를 쓰고 싶다면 – nazca

+0

예를 들어 Ruby는 같은 테스트에서 30 배 더 느립니다 ... – nazca

9

수업은 다음과 같습니다. 그러므로 항상 측정하고, 결코 믿지 마십시오.

당신이이 숫자를 볼 수 있습니다 (첫 번째 문장에서, 이들 중 일부는 완전히 잘못 될 수도 있습니다) 몇 가지 이유 :

C는 "에는 i586"프로세서 (또한 펜티엄)에 대한 컴파일이. 이 CPU는 1993 년에서 2000 년 사이에 판매되었습니다. 최근에 본 적이 있습니까? 맞춰봐. 따라서 C 코드는 CPU가 수행 할 수있는 작업에 실제로 최적화되어 있지 않습니다 (또는 다른 방법으로 배치해야합니다 : 오늘날의 CPU는 빠른 펜티엄 CPU가되기 위해 매우 열심히 노력합니다). Java, OTOH는 코드가로드 될 때 CPU 용으로 컴파일됩니다. C가 할 수없는 몇 가지 트릭을 가져올 수 있습니다. 자바 프로그램이 4 초를 필요로하는 반면 가격은 C 프로그램이 15ms에서 시작한다는 것입니다.

파이썬에는 아직 JIT (JIT 컴파일러)가 없습니다. 모든 코드는 바이트 코드로 변환되어 해석됩니다. 이것은 위의 루프가 12 개의 바이트 코드 명령어로 변환되어 C 프로그램에 의해 해석된다는 것을 의미합니다. 그것은 단지 시간이 걸립니다. 파이썬은 커다란 루프를위한 것이 아니며, 다른 언어로는 표현할 수없는 똑똑한 알고리즘을위한 것입니다 (적어도 같은 양의 코드와 가독성을 가진 것은 아닙니다).

18t 트럭으로 쇼핑하는 것이 의미가 없듯이 (당신은 아무것도 수송 할 수는 있지만 주차 할 수있는 공간을 찾지 못할 것입니다.), 해결해야 할 문제에 따라 프로그래밍 언어를 선택했습니다 . 그것은 작은 & 빠른되어야합니까? C. 빨리? 자바. 융통성 있는? 파이썬. 유연한 & 패스트 : C에서 도우미 라이브러리 (예 : NumPy)가있는 Python.

+1

그것은 거짓말, 거짓된 거짓말, 통계가 있습니다. 이 경우에는 "거짓말, 거짓된 거짓말, 벤치 마크가 있습니다"라고 말할 수 있습니다. - 그건 내가 몇 년 전에 배웠던 한 가지입니다. - 유용한 벤치 마크에서 측정하지 않는 한 대부분의 벤치 마크는 거의 쓸모가 없습니다. –

+0

실제로 내 C 컴파일러 (gcc 4.2 + llvm)는 x86_64라는 프로세서를 기본적으로 컴파일합니다. 프로세서 아키텍처는 붉은 청어입니다. C 수치와 Java 수치의 실제 차이점은 - 다른 의견에 따르면 - 다른 최적화 수준입니다. – JeremyP