Cython cdef没有速度增加

问题描述:

我终于得到了cython的工作感谢这里的一些人在*,但现在有一个问题。从我不使用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

您指数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