Python,如何优化这个cod

2024-05-16 15:36:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图优化下面的代码,但我不知道如何提高计算速度。我试过Cthon,但性能就像python。在

<>是否可以在不重写C/C++的情况下提高性能?在

谢谢你的帮助

import numpy as np

heightSequence = 400
widthSequence = 400
nHeights = 80

DOF = np.zeros((heightSequence, widthSequence), dtype = np.float64)
contrast = np.float64(np.random.rand(heightSequence, widthSequence, nHeights))

initDOF = np.zeros([heightSequence, widthSequence], dtype = np.float64)
initContrast = np.zeros([heightSequence, widthSequence, nHeights], dtype = np.float64)
initHeight = np.float64(np.r_[0:nHeights:1.0])
initPixelContrast = np.array(([0 for ii in range(nHeights)]), dtype = np.float64)


# for each row
for row in range(heightSequence):
    # for each col
    for col in range(widthSequence):

        # initialize variables            
        height = initHeight # array ndim = 1
        c = initPixelContrast # array ndim = 1

        # for each height            
        for indexHeight in range(0, nHeights):
            # get contrast profile for current pixel
            tempC = contrast[:, :, indexHeight]
            c[indexHeight] = tempC[row, col]

        # save original contrast            
        # originalC = c
        # originalHeight = height                

        # remove profile before maximum and after minumum contrast
        idxMaxContrast = np.argmax(c)
        c = c[idxMaxContrast:]
        height = height[idxMaxContrast:]

        idxMinContrast = np.argmin(c) + 1
        c = c[0:idxMinContrast]
        height = height[0:idxMinContrast]              

        # remove some refraction
        if (len(c) <= 1) | (np.max(c) <= 0):
            DOF[row, col] = 0                  

        else:

            # linear fitting of profile contrast                                             
            P = np.polyfit(height, c, 1)
            m = P[0]
            q = P[1]

            # remove some refraction               
            if m >= 0:
                DOF[row, col] = 0

            else:
                DOF[row, col] = -q / m

    print 'row=%i/%i' %(row, heightSequence)

# set range of DOF
DOF[DOF < 0] = 0
DOF[DOF > nHeights] = 0

Tags: infornpzerosrangecolrowheight
1条回答
网友
1楼 · 发布于 2024-05-16 15:36:53

通过查看代码,您似乎可以完全消除这两个外部循环,将代码转换为矢量化的形式。然而,np.polyfit调用必须被其他表达式替换,但是线性拟合的系数很容易找到,而且也是向量形式。最后一个if-else可以转换为np.where调用。在

相关问题 更多 >