-1

我正在编写 python 代码,我的问题是这段代码需要很多时间,我想知道是否有可能让它更快?我有两个元组列表如下:

Similarities = [(1, 1, 1.0),(1, 2, -0.0016),(1, 3, 0.01764),(1, 4, -0.0033),(1, 5, -0.0016),...]

Trust = [(2, 104, 1),(5, 1509, 1),(6, 1192, 1),(7, 1510, 1),(12, 234, 1),(15, 652, 1),...]

我的 touples 的长度Similarities = 2274064和长度采用以下格式:Trust = 37997(i,j,value)

如果 i 和 j 在循环范围内,我想检查元组,函数将它们的值返回给循环,检查后,如果这些值存在或不存在,将计算 d。然后将 d 的数量附加到二维数组中。

现在我想运行下面的代码:

totalDistance=[]
totalSim=[]
for i in range(1642):
    totalDistance.append([])
    totalSim.append([])
    for j in range(1642):
        //search in Trust list to find value of trust i and j
        tr=calcTrustDif(i,j)
        //search in Similarities list to find value of similarity i and j
        pc=calcPccDif(i,j)
        if tr and pc:
            d=math.sqrt(pow(pc,2)+pow(tr,2))
        elif tr and not(pc):
            d=tr
        elif pc and not(tr):
            d=pc
        else:
            d=3
        totalSim[i].append(1-d)
        totalDistance[i].append(d)
def calcTrustDif(i,j):
    
    tr=[t for t in Trust if t[0]== i and t[1]==j]
    if tr:
        return tr[0][2]
    else:
        pass
def calcPccDif(i,j):
    
    pc=[t for t in Similarities if t[0]== i and t[1]==j]
    if pc:
        return 1-pc[0][2]
    else:
        pass

我估计,我发现这段代码需要 82 小时,而且非常糟糕......有人可以帮我减少运行时间吗?我认为对于这种我不知道的情况,python 具有神奇的功能。

4

1 回答 1

1

您应该阅读时间复杂度和大 O 表示法

您的代码运行如此缓慢的原因是您正在使用三重嵌套for循环,这会导致非常糟糕的时间复杂度〜特别O(n*n*(allT+allP))n = 1642在您的情况下。

我建议您尝试提出一种算法,您不必反复allP迭代allT 1642*1642。只需选择一个更好的算法就可以大大提高运行时间,而无需求助于任何“Python 魔法”

注意:如果您为变量使用更有意义的名称,您可以让其他人更容易理解您试图通过代码实现的目标。例如 , , 的含义对您来说calcPccDif()可能很明显,但对其他人没有任何意义,从而使其他人难以阅读您的代码。(另一方面,清晰而有意义。)allPallTtotalDistance

于 2020-07-09T16:04:38.253 回答