2013-04-02 46 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()