2012-07-31 93 views
1

我終於得到了cython的工作感謝這裏的一些人在stackoverflow,但現在有一個問題。從我不使用cdef到使用cdef時,速度確實沒有增加。不要誤解我的錯誤,當我使用cython編譯python代碼時,速度有了非常明顯的提高,但是當我使用cdef時卻沒有這樣做。Cython cdef沒有速度增加

這是已減緩程序的其餘部分的代碼區:

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) 

此代碼應該被越來越稱爲60次,但由於代碼的速度,我的舊硬件每秒鐘只能調用30次,我認爲使用cdef來處理x和y等強烈使用的變量會有所幫助。但是在cdef之前和之後fps是一樣的。

我對Windows 7的64位以32位的蟒蛇2.7

+0

我現在只是自己學習cython,但我的第一印象是,你可能會使用一些未優化的調用。只需輸入x和y在這裏可能不夠用。 – jdi 2012-07-31 05:22:54

+0

'x'和'y'不是被激烈使用的那些...... – 2012-07-31 05:23:02

+0

那麼哪些得到intenesly使用? x和y是循環的指數? – 2012-07-31 05:23:55

回答

5

您指數self.map11倍代碼,具有相同索引。索引它一次,將引用複製到本地名稱,然後使用該名稱。

+0

我可能是錯的,但是也值得一提的是,在這種情況下鍵入x和y並不是特別有用,因爲除了使用它們作爲索引之外,沒有什麼比使用它們更好的了...我是對的嗎? – jdi 2012-07-31 05:27:14

+1

更糟糕的是,當它們放入索引操作的元組時,它們需要* detyped *。 – 2012-07-31 05:28:22

+0

謝謝!只有這一點,我的速度有了很大的提高。但是,self.map是Block對象的字典。有沒有什麼辦法可以讓對象變成cdef? – 2012-07-31 05:28:46