아래 코드를 보고 순서대로 왜 더 빠른 건지 메모리, 파이썬의 스레드 동작 원리에 근거하여 설명해봐


import time



maxlen = 10**6

start = time.time()
tup = [i for i in range(maxlen)]
end = time.time()
print(end - start)

start = time.time()
def generate_tuple(size):
for i in range(size):
yield i
tup = tuple(generate_tuple(maxlen))
end = time.time()
print(end - start)

start = time.time()
arr = []
for i in range(maxlen):
arr.append(i)
end = time.time()
print(end - start)