2010-04-23 4 views
35

파이썬 코드를 최적화하는 방법을 찾고있는 동안 방금 Cython을 보았습니다. stackoverflow, python wiki에 대한 다양한 게시물을 읽고 "일반 규칙 최적화"기사를 읽었습니다.Cython 속도 향상과 유용성

Cython은 내 관심을 가장 잘 파악합니다. 직접 C 코드를 작성하는 대신 파이썬 코드 자체에 다른 데이터 유형을 사용할 수 있습니다. 여기

#!/usr/bin/python 
# test.pyx 
def test(value): 
    for i in xrange(value): 
    i**2 
    if(i==1000000): 
     print i 

test(10000001) 

$ 시간 파이썬은

real 0m16.774s 
user 0m16.745s 
sys  0m0.024s 

$ 시간을 test.pyx, 내가 노력 바보 테스트입니다 사이 썬 test.pyx 이제

real 0m0.513s 
user 0m0.196s 
sys  0m0.052s 

, 솔직히, 나는 어리 석다. 여기에서 사용한 코드는 순수한 파이썬 코드이며, 필자가 변경 한 것은 인터프리터입니다. 이 경우, cython이 좋으면 사람들이 전통적인 파이썬 해석기를 사용하는 이유는 무엇입니까? Cython에 대한 안정성 문제가 있습니까?

+14

일부 Cython 코드의 컴파일 시간 대 Python 스크립트의 런타임을 측정합니다. 그것은 아무 의미가 없습니다. –

+2

귀하의 마지막 발언은 기본적으로 줄리아가하려고하는 것입니다 : 일관된 고수준 기계 언어로 최적화 된 하위 레벨 코드 변환기를 만들고 처음부터 명확하게이 의도를 보여줌으로써 더 나은 견인력을 얻을 수 있습니다 동적 타이핑과 같은 방식으로 일부 고급 기능이 손실된다는 것을 의미합니다. – gaborous

+1

@SturlaMolden : 파이썬이 Cython 복사와 테스트를 테스트하지 않았습니까? 그렇다면 완벽하게 이해할 수 있습니다. – Eddy

답변

50

다른 답변은 이미 Cython 코드를 컴파일하고 실행하는 방법에 대해 이미 설명했습니다. 그러나 Cython이 얼마나 빨리 코드를 작성할 수 있는지 알고 싶을 수도 있습니다. distutils으로 코드를 컴파일했을 때 (다른 모듈의 함수를 실행 했음에도 불구하고), 직선적 인 파이썬보다 약 속도가 느 렸습니다 (약 1 %).난 당신의 코드에 몇 가지 작은 변화를 추가 그러나 :

  • 순수 파이썬 코드 : 20.4553578737 초
  • 사이 썬 코드

    def test(long long value): 
        cdef long long i 
        cdef long long z 
        for i in xrange(value): 
         z = i**2 
         if(i==1000000): 
          print i 
         if z < i: 
          print "yes" 
    

    하고 컴파일을, 나는 다음과 같은 시간을 가지고 : 0.199339860234 초

100 배속입니다. 너무 초라한.

+27

그것은 정확성의 댓가로 제공 될 수 있습니다. 파이썬 코드는'i ** 2'의 올바른 값을 계산합니다. C 코드는 32 비트 코드를 컴파일하는 경우 작업을 수행하는 대부분의 숫자에서 오버플로됩니다. (만약 C 컴파일러가 동작을 전혀 수행하지 않는다면, C 컴파일러가 동작을 모두 최적화하는 것으로 생각할 수 있습니다.) 이것은 아마도 공정한 비교는 아닙니다. 당신은 또한 당신이 무엇을하고 있는지, 당신이 그것을 어떻게 운영하고 있는지, 그리고 당신이 그 시간을 줄 때 당신이 무엇을하고 있는지 명확하게 밝히지 않았습니다. –

+0

덧붙여 말하자면, 이것은 "quirks"가 의미하는 것입니다. 파이썬 코드가 정확함을 보장하는 검사를 자동으로 수행 할 때 오버플로의 예가 거의 제공 되었기 때문에 C에서 자동으로 실패합니다. –

+6

당신 말이 맞습니다. 내가 그 일을하는 동안 오버플로에 대해 생각했지만, 게으르다. 왜냐하면 내가이 경우에별로 중요하지 않다는 것을 알았 기 때문이다. 나는 long longs를 사용하도록 고쳐 줄 것이다. –

18

Cython은 다른 해석기가 아닙니다. 파이썬 (같은) 코드에서 파이썬에 대한 c- 확장자를 생성합니다. cython test.pyx은 'test.c'파일만을 생성합니다. 컴파일 된 파일은 일반적인 파이썬 라이브러리처럼 파이썬에서 사용할 수 있습니다.

즉, 파이썬 코드를 파이썬 코드를 c로 변환하는 데 소요되는 시간을 측정하는 것입니다. 즉, 코드의 버전이 실행되는 속도가 아닙니다.

+4

네, cython이 실제로 컴파일되어 한 줄로 프로그램을 실행하기를 원하는 사람이라면 runcython (https://github.com/russell91/runcython)을 만들었습니다. 'runcython test.pyx'는 OP가 의도 한 의미를 가질 것입니다. – RussellStewart

9
  • cython test.pyx 실제로 프로그램을 실행하지 않습니다. cython 바이너리는 Cython 코드를 파이썬 확장 모듈로 처리하기위한 것입니다. 파이썬으로 가져 와서 실행시켜야합니다.

  • #!/usr/bin/python은 파이썬 스크립트에 가장 적합한 세뱅 라인이 아닙니다. 일반적으로 명령 행에서 python을 실행하는 #!/usr/bin/env python이 바람직합니다.

    • 사이 썬 pyx 파일은 아마 그들이 유효한 파이썬 프로그램입니다 코너 경우를 제외하고는 전혀 오두막 라인이 없어야합니다.
  • 게시 된 코드에 들여 쓰기 오류가 있습니다.

  • 전통적인 인터프리터를 사용하는 것이 더 간단하고 휴대가 편리합니다. Cython은 신뢰할 만하지만 한계와 단점이 있습니다. 마술처럼 속도를 내서 타이밍을 보이게 만들면 실제로 사용하는 것이 더 매력적일 수 있지만 실제로는 작은 것을 제공합니다. C 기능을 사용하여 많은 속도 향상을 보려면 Cython 관련 기능을 사용해야합니다.

9

실종 된 것 같은 큰 요점 : Cython은 파이썬의 엄격한 상위 집합이 아닙니다. 파이썬이 지원하는 몇 가지 기능이 있지만 Cython은 지원하지 않습니다. 가장 주목할 만하게, 발전기와 람다 (그러나 그들은오고있다).

+2

그들이 아직 왔는지 아십니까? –

2
  • 가장 큰 이유 Cython은 그다지 널리 사용되지 않는 독립 실행 형 (파이썬없이) 실행 파일입니다.

  • 홍보 부족. 개발자는 최첨단 언어보다 현자 소프트웨어 개발에 더 관심이있는 학자 인 것으로 보입니다.

  • 개발 중에 마주 칠 곳. 내가 만난 하나의 진정한 스레드 지원 부족합니다. 모든 것이 전역 인터프리터 잠금에 싸여있어 스레드 안전을 유지하지만 동시성을 사용하지 못하게합니다! 실제로 컴파일 그 사이 썬 소원과 한 줄에 프로그램을 실행 사람들을위한

+6

필요하지 않은 경우 GIL을 해제 할 수 있습니다.그것은 파이썬 C API를 사용하지 않을 때입니다. Cython에서 이것은 "with nogil :"로 작성되며, GIL을 해제 할 때 오류가 발생합니다. 파이썬 스레드는 네이티브 OS 스레드이며, GIL이 릴리스 될 때 동시성을 제공합니다. 파이썬과 싸이언 모두 마찬가지입니다. –

+0

[wikipedia] (https://en.wikipedia.org/wiki/Global_interpreter_lock)에 따르면 CPython (즉, Python)은 GIL을 사용하므로 병렬성/동시성 기능이 Cython에서 더 우수하지 않습니다. –