1

我有这段代码运行得太慢了。

 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 数组,这可能有助于加快我的代码速度。谁能告诉我这是否是解决这个问题的好方法?

4

1 回答 1

0

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

我的第一个猜测是你maskFunction一直在占用。

其次,np.array().astype()将两个都很慢的函数链接在一起,运行~是第三个函数。然后你的外循环有astypeand tolist,它们都很慢。在 Cython 中做这些事情是你真正看到改进的地方。

我真的很怀疑range并且print正在花费大量时间。

你测量过瓶颈吗?我通常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()
于 2013-04-18T03:41:38.710 回答