2012-07-31 4 views
1

마침내 cython이 stackoverflow에서 사람들의 덕택으로 일해 왔지만 지금은 문제가 있습니다. 실제로는 cdef를 사용하지 않을 때부터 cdef를 사용할 때까지 속도가 증가하지 않습니다. 내가 잘못 cyp를 사용하여 파이썬 코드를 Cython을 사용하여 컴파일했을 때 매우 눈에 띄는 속도 증가가 있었지만 나쁘게 생각하지 마십시오. Cython cdef no speed increase

프로그램의 나머지 부분을 둔화 된 코드의 영역입니다 :

def tupdate(self,surf):  

    cdef int x 
    cdef int y 

    for x in xrange(self.w): 
     for y in xrange(self.h): 
      if self.map[(x,y)].y <= 600 and self.map[(x,y)].y >= -50: self.map[(x,y)].FLAG = 1 
      else: self.map[(x,y)].FLAG = 0 
      self.map[(x,y)].y += self.speed 
      if self.map[(x,y)].FLAG: 
       self.map[(x,y)].rect = ((self.map[(x,y)].x,self.map[(x,y)].y),(50,25)) 
       self.map[(x,y)].update() 
       self.map[(x,y)].render(surf) 

이 코드 해야 1 초에 60 번이라고 점점 수 있지만 인해 코드의 속도와 내 오래된 하드웨어는 단지 약 30 번 두 번째 호출, 나는 x와 y처럼 도움이 될 것 같은 집중 사용 vars에 대한 cdef를 사용하여 생각. 그러나 cdef는 cdef 전과 후에 동일합니다.

나는 같은 인덱스, 코드에서 32 비트 파이썬 2.7

+0

나는 지금 당장 스스로 cython을 배우고있다.하지만 내 첫인상은 최적화되지 않은 호출을 많이 사용하고 있다는 것이다. x와 y를 입력하기 만하면 충분하지 않을 것입니다. – jdi

+0

'x'와'y'는 강렬하게 사용되는 것이 아닙니다 ... –

+0

그러면 intenesly 사용되는 것들은 무엇입니까? x와 y는 루프의 인덱스입니까? –

답변

5

당신 지수 self.map11 배를 사용하여 윈도우 7 64 비트에 있어요. 번으로 색인을 만들고 로컬 이름으로 참조를 복사 한 다음 해당 이름을 사용하십시오.

+0

나는 틀릴 수도 있지만 x와 y를 타이핑하는 것이 인덱스로서 사용하는 것 외에는 그다지 도움이되지 않기 때문에 특히 유용하지는 않습니다. – jdi

+1

더 나쁜 것은 색인 작업을 위해 튜플에 넣을 때 * 디 타입 * 될 필요가 있다는 것입니다. –

+0

감사! 그것만으로도 나에게 좋은 속도 향상을주었습니다. 그러나 self.map은 Block 객체의 사전입니다. 어떤 방법으로 객체를 cdef 할 수 있습니까? –