2013-04-02 45 views
1

我有这个代码,只是运行速度太慢。使用Cython动态内存分配

returnMask = [] 
for curPage in range(numPages): 
    print curPage 
    curPageAddr = curPage + startPage 
    cumMask = np.ones((numBytes)).astype(int) * 0xff 
    for maskFunction, maskAction in maskPattern: 
      #maskArgs['funcArgs']['startPage'] = curPageAddr 
      #maskArgs['funcArgs']['numPages'] = 1 
      inputArgs['funcArgs']['startPage'] = curPageAddr 
      inputArgs['funcArgs']['numPages'] = 1 
      curMaskName, curMaskData = maskFunction(inputArgs) 
      if (maskAction == 'include'): 
        maskIn = np.array(curMaskData).astype(int) 
      if (maskAction == 'exclude'): 
        maskIn = (~np.array(curMaskData).astype(int)) & 0xff 
      cumMask = cumMask & maskIn 
    print "cumMask size %d" % len(cumMask) 
    returnMask += cumMask.astype(int).tolist() 

基本上,我的for循环外是循环2000次,每次附加的2048个字节成returnMask列表。我想我可以使用Cython,将returnMask改为动态分配的c数组,这可能有助于加快我的代码。任何人都可以告诉我,如果这是解决这个问题的好方法吗?

+0

请发表整个代码。切换到'xrange'而不是'range'。此外,由于打印语句,您的代码可能花费大量时间写入终端。 –

+0

要发布代码,请前往[pastebin](http://pastebin.com/) – xxmbabanexx

回答

0

很难说 - 它有多慢(以秒为单位)?

我的第一个猜测是你的maskFunction一直在采取。

二,np.array().astype()正在链接在一起两个功能都很慢,并且运行~是第三个功能。然后你的外循环有astypetolist,这两个都很慢。在Cython中做这些事情是你真正看到改进的地方。

我真的怀疑rangeprint正在花费大量的时间。

您是否测量了瓶颈?我通常会在各个功能周围拨打一些time.time()来调用整个循环的平均值:

dt = np.zeros((len(loop),)) 
for i in loop: 
    t = time.time() 
    slow_function() 
    dt[i] = time.time() - t 
print "avg. time for slow_function was %.3f s" % dt.mean()