2013-10-22 3 views
1

Cython에서는 선언되지 않은 변수 유형이 전체 프로세스의 속도를 늦추는 데 더 많은 오버 헤드를 발생시키는 것으로 알려져 있습니다. 이 미지의 변수 타입처럼 중첩 루프 내부에 사용되는 경우모든 변수를 명시 적으로 선언하는 Cython 명령

:

def test(b, c, m, n, p): 
ctype double a 
for i in range(m) 
    for j in range(n) 
     for k in range(p) 
      a = b + c 
return a 

오버 헤드가 더 높을 수있다. 많은 변수가있는 문제에서 하나 또는 다른 유형을 선언하는 것을 쉽게 잊어 버릴 수 있으며 컴파일러는 Cython이 필요한 오버 헤드를 수행하므로 경고를 발생시키지 않습니다.

모든 변수가 명시 적으로 선언되도록하는 명령이 Cython에 있습니까?

답변

3

Cython에서는 선언되지 않은 변수 유형이 전체 프로세스의 속도를 늦추는 데 더 많은 오버 헤드를 발생시키는 것으로 알려져 있습니다. 당신이 잘못 알고

(limited) type inferencenot every type annotation improves performance (예를 들어, 다시 새로운 객체에 그것을 포장, 변경 파이썬에 건네 다음의 int 인수를 풀기 등)이있다. 더 유용한 메트릭은 CPython API 호출의 양이며 cython -a이 알려줍니다.

+0

나는, 긍정에서 너무 일반적이었다 [있지만 모든 경우에 제가 일한지 (https://github.com/ :

는 보통 중요한 부분은 루프에 대한 깊은 saullocastro/desicos/blob/master/desicos/clpt.pyx), 명시 적 선언은 성능을 크게 향상시킵니다 (중첩 루프 내에서 하나의 변수를 선언하지 않음으로써 측정 할 수 있음) –

+0

@SaulloCastro 좋습니다. 어쨌든 "typedness annotation"은 또한 잠재적 인 다른 문제 (예 : 앞에서 설명한 int -> object wrapping)를 발견하므로 어쨌든 그것을 권하고 싶습니다. – delnan

1

반드시 대답이 제시 한 해결책부터 시작해야합니다.

또 다른 좋은 해결책은 코드의 중요한 부분을 with nogil: 블록 안에 넣는 것입니다. 파이썬 API가 호출되면 컴파일 오류가 발생합니다.

어쩌면
with nogil: 
    for i in range(m): 
     for j in range(n): 
      for k in range(p): 
       for l in range(q): 
        ... 
관련 문제