【问题标题】:Cython cdef no speed increaseCython cdef 没有速度增加
【发布时间】:2012-07-31 05:20:37
【问题描述】:

感谢 stackoverflow 上的一些人,我终于让 cython 工作了,但现在出现了问题。从我不使用 cdef 到使用 cdef 时,速度确实没有提高。不要误会我的意思,当我使用 cython 编译 python 代码时,速度有一个非常明显的提升,但当我使用 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 64bit 上使用 32bit python 2.7

【问题讨论】:

  • 我现在只是在自己学习 cython,但我的第一印象是您可能正在使用一堆未优化的调用。在这里仅仅输入 x 和 y 可能还不够。
  • xy 不是被大量使用的......
  • 那么哪些是最常用的呢? x 和 y 是循环的索引?
  • self.map 是所有地图数据的字典。我将如何使用 cython 来优化它?
  • 如果我没记错的话,字典可以映射到结构。因此,您必须相应地键入您的 map 对象,以便 cython 可以优化查找。这只是我目前所知道的猜测。

标签: python c cython


【解决方案1】:

你在代码中索引self.map11次,索引相同。将其索引一次,将引用复制到本地名称中,然后使用该名称。

【讨论】:

  • 我可能是错的,但值得一提的是,在这种情况下键入 x 和 y 并不是特别有用,因为除了将它们用作索引之外,没有对它们做任何事情......我是对吗?
  • 更糟糕的是它们在放入元组进行索引操作时需要被detyped
  • 谢谢!仅这一点就给了我很好的速度提升。然而,self.map 是一个 Block 对象的字典。有没有办法 cdef 一个对象?
  • @MattRoelle:看看cdef classes
猜你喜欢
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
相关资源
最近更新 更多