2012-02-20 7 views
1

파이썬 코드를 C로 포팅하려고하지만 성능 테스트를 수행하기 전에 성능을 향상시키지 못한 것처럼 보입니다.Cython 성능 테스트

먼저 C 프로그램 :

#include <stdio.h> 
main() 
{ 
    printf("hello world \n"); 
} 

[[email protected] c]$ gcc test.c 
[[email protected] c]$ time ./a.out 
hello world 

real 0m0.001s 
user 0m0.000s 
sys  0m0.000s 

두 번째 파이썬 프로그램 : 사이 썬하지 않았다처럼 사이 썬 셋째

#!/usr/bin/env python 

print "hello world \n" 


[[email protected] c]$ time python test.py 
hello world 


real 0m0.024s 
user 0m0.020s 
sys  0m0.003s 

...

test.py 

print "hello world \n" 

[[email protected] c]$ cython --embed test.py 
[[email protected] c]$ gcc $CFLAGS -I/usr/include/python2.6 -o test test.c -lpython2.6 -lpthread -lm -lutil -ldl 

[[email protected] c]$ time ./test 
hello world 


real 0m0.024s 
user 0m0.019s 
sys  0m0.004s 

그래서 나에게 그것은 본다 정말 모든 성능을 향상시킵니다. 왜 그리고 어떻게 cython으로 이것을 고칠 수있는 아이디어가 있으면 파이썬 코드를 더 빠르게 실행할 수 있습니까?

+2

Cython은 바이트 코드 디스패치 오버 헤드를 제거하고 정적 유형 주석으로 힌트를 제공하면 Python 객체를 제거 할 수 있습니다. 모든 파이썬 코드를 마술처럼'libc' 호출로 컴파일 할 수는 없으며 인터프리터의 C API를 호출하지 않고 대부분의 파이썬 의미를 구현할 수 없습니다. 10 억 개의 정수를 추가하는 루프를 비교해보십시오. – delnan

답변

13

여기서 보는 것은 실제 성능 테스트가 아닙니다. 귀하는 귀하의 프로그램에서 오직 의 작은 조작만을하고 있습니다.

전체 실행 시간이 무효입니다. 실행 시간에서 중요한 것은 오버 헤드입니다. 프로세스 시작을위한 오버 헤드와 인터프리터 시작을위한 파이썬의 케이스 오버 헤드.

그리고 마지막으로 I/O 성능을 테스트하고 있습니다. 그 자체는 매우 까다로운 일입니다. 왜냐하면 I/O의 성능은 프로그래밍 언어에 의해서가 아니라 OS에 의해 종종 제한되기 때문입니다.

+2

정확한 응답 - 결과와 함께 cython과 C 코드를 적절히 테스트하기위한 예제를 추가하면 투표를하겠습니다. 내가 직접 할거야하지만 Windows 상자에있어 Cython을 컴파일 할 수없는 것 같습니다 ... – Alex