[Python] Nested list time complexity


Pythonを用いて符号化する場合,Nested listを簡潔な表現やパラメータとして用いることが多い.3つのlistを作成して管理する以上、1つのリストからtupleまで3つのパラメータを含み、インデックスでアクセスするのは簡単です.
しかし、nested listを使って本当にしばらく試してみたのが問題です.白駿10216 Disjoin-set設計アルゴリズムを使用すると、O(n^2)が現れる可能性があるので、タイムアウトが懸念され、予想通りタイムアウトが発生しました.でも問題は...つまり、もう一つの解法は私のアルゴリズムの流れに従います.でも.Pythonの接着剤がなかったので、しばらくCを見ただけで、本当に読めなかったので、簡単にPythonの接着剤を見つけましたが、やはり知らず、悩んでしまいました.
問題は、NestedListの時間がList*Nの時間よりずっと長いことである.次のコードを返すと、nested listは5.42 s、3 listは2.33秒かかります.重複する数が少なければ賞はありません.そうしないと大きな違いがあります.これを探してる...どれくらい時間がかかったか...ぜひ参考にしてください
import time 

it = 1000000
nest_list = [(i-1, i, i+1) for i in range(1, it)]

a_list = [i-1 for i in range(1, it)]
b_list = [i for i in range(1, it)]
c_list = [i+1 for i in range(1, it)]

start = time.time()

for i in range(it-1):
	ans = nest_list[i][0] + nest_list[i][1] + \
    	nest_list[i][2]

print(f"nest list iteration time {time.time() - start}")

start = time.time()
for i in range(it-1):
	ans = a_list[0] + b_list[1] + c_list[2]
    
print(f"normal 3 list iteration time {time.time() - start}")

問題を解くときに参考にしてください.
# O(n^2) 알고리즘으로 풀어낼 수 있지않을까? disjoint-set과 함께

import sys

DEBUG = True

def log(message):
    if DEBUG:
        print(message)


def find(i):
    if parent[i] != i:
        parent[i] = find(parent[i])
    return parent[i]

def union(irep,jrep):
    
    if size[irep] < size[jrep]:
        parent[irep] = jrep
        size[jrep] += size[irep]
        size[irep] = 0 
    else:
        parent[jrep] = irep
        size[irep] += size[jrep]
        size[jrep] = 0

T = int(sys.stdin.readline())
for _ in range(T):
    N = int(sys.stdin.readline())

    parent = [i for i in range(N)]
    size = [1] * (N)
    ans = N

    x_pos, y_pos, radius = [], [], []
    for _ in range(N):
        x, y, r = map(int, sys.stdin.readline().split())
        x_pos.append(x)
        y_pos.append(y)
        radius.append(r)

    for i in range(N-1):
        for j in range(i+1, N):
            x_diff = x_pos[i] - x_pos[j]
            y_diff = y_pos[i] - y_pos[j]
            dist = radius[i] + radius[j]

            if (x_diff**2) + (y_diff**2) <= dist **2:
                irep = find(i); jrep = find(j)
                if irep != jrep:
                    union(irep,jrep)
                    # parent[irep] = jrep
                    ans -= 1
    sys.stdout.write(f"{ans}\n")