March 9, 2025

Code

import numpy as np
import scipy.sparse as sp
import scipy.sparse.linalg as spla
import time

N = 50000

np.random.seed(42)
B_dense = np.random.rand(N)

# Dense Matrix
A_dense = np.random.rand(N, N)
B_dense = np.random.rand(N)
start_time = time.time()
X_dense = np.linalg.solve(A_dense, B_dense)
dense_time = time.time() - start_time

# Sparse Matrix
diagonals = [
    np.random.rand(N),
    np.random.rand(N-1),
    np.random.rand(N-1)
]
A_sparse = sp.diags(diagonals, offsets=[0, 1, -1], format='csr')
B_sparse = B_dense.copy()
start_time = time.time()
X_sparse = spla.spsolve(A_sparse, B_sparse)
sparse_time = time.time() - start_time

# Result
print(
    {
        "Dense Matrix": {"Time (s)": dense_time},
        "Sparse Matrix": {"Time (s)": sparse_time},
    }
)

Result

N=10000

{'Dense Matrix': {'Time (s)': 2.7376339435577393, 'Memory Usage (MB)': 29.343744000000015}, 'Sparse Matrix': {'Time (s)': 0.0051233768463134766, 'Memory Usage (MB)': 0.5529599999999846}}

N=50000

Memory Overflow! my 32GB Memory when it is dense.
{'Sparse Matrix': {'Time (s)': 0.024787425994873047}}

N=10000000

{'Sparse Matrix': {'Time (s)': 5.945250511169434}}