here2share

# linear_algebra_timeit.py

Oct 4th, 2025
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.49 KB | None | 0 0
  1. # linear_algebra_timeit.py
  2.  
  3. import timeit
  4.  
  5. def dot_loop(a, b):
  6.     result = 0
  7.     for i in range(len(a)):
  8.         result += a[i] * b[i]
  9.     return result
  10.  
  11. def dot_linalg(a, b):
  12.     return sum(x * y for x, y in zip(a, b))
  13.  
  14. def matrix_mult_loop(A, B):
  15.     rows_A, cols_A = len(A), len(A[0])
  16.     rows_B, cols_B = len(B), len(B[0])
  17.     result = [[0] * cols_B for _ in range(rows_A)]
  18.     for i in range(rows_A):
  19.         for j in range(cols_B):
  20.             for k in range(cols_A):
  21.                 result[i][j] += A[i][k] * B[k][j]
  22.     return result
  23.  
  24. def matrix_mult_linalg(A, B):
  25.     return [[sum(a * b for a, b in zip(row, col)) for col in zip(*B)] for row in A]
  26.  
  27. def normalize_loop(v):
  28.     mag = 0
  29.     for x in v:
  30.         mag += x * x
  31.     mag = mag ** 0.5
  32.     result = []
  33.     for x in v:
  34.         result.append(x / mag)
  35.     return result
  36.  
  37. def normalize_linalg(v):
  38.     mag = sum(x * x for x in v) ** 0.5
  39.     return [x / mag for x in v]
  40.  
  41. def add_loop(a, b):
  42.     result = []
  43.     for i in range(len(a)):
  44.         result.append(a[i] + b[i])
  45.     return result
  46.  
  47. def add_linalg(a, b):
  48.     return [x + y for x, y in zip(a, b)]
  49.  
  50. def transpose_loop(M):
  51.     rows, cols = len(M), len(M[0])
  52.     result = []
  53.     for c in range(cols):
  54.         row = []
  55.         for r in range(rows):
  56.             row.append(M[r][c])
  57.         result.append(row)
  58.     return result
  59.  
  60. def transpose_linalg(M):
  61.     return list(map(list, zip(*M)))
  62.  
  63. def cross_product_loop(a, b):
  64.     return [
  65.         a[1] * b[2] - a[2] * b[1],
  66.         a[2] * b[0] - a[0] * b[2],
  67.         a[0] * b[1] - a[1] * b[0]
  68.     ]
  69.  
  70. def cross_product_linalg(a, b):
  71.     return [a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]]
  72.  
  73. def run_benchmarks():
  74.     print("=" * 70)
  75.     print("LINEAR ALGEBRA VS LOOPS PERFORMANCE")
  76.     print("=" * 70)
  77.    
  78.     sizes = [100, 500, 1000]
  79.    
  80.     for n in sizes:
  81.         print(f"\n--- SIZE n={n} ---\n")
  82.        
  83.         v1 = list(range(n))
  84.         v2 = list(range(n, 2*n))
  85.        
  86.         print(f"DOT PRODUCT (n={n}):")
  87.         t1 = timeit.timeit(lambda: dot_loop(v1, v2), number=1000)
  88.         t2 = timeit.timeit(lambda: dot_linalg(v1, v2), number=1000)
  89.         print(f"  Loop:        {t1:.6f}s")
  90.         print(f"  Comprehension: {t2:.6f}s")
  91.         print(f"  Speedup:     {t1/t2:.2f}x\n")
  92.        
  93.         print(f"ELEMENT-WISE ADD (n={n}):")
  94.         t1 = timeit.timeit(lambda: add_loop(v1, v2), number=1000)
  95.         t2 = timeit.timeit(lambda: add_linalg(v1, v2), number=1000)
  96.         print(f"  Loop:        {t1:.6f}s")
  97.         print(f"  Comprehension: {t2:.6f}s")
  98.         print(f"  Speedup:     {t1/t2:.2f}x\n")
  99.        
  100.         print(f"NORMALIZE (n={n}):")
  101.         t1 = timeit.timeit(lambda: normalize_loop(v1), number=1000)
  102.         t2 = timeit.timeit(lambda: normalize_linalg(v1), number=1000)
  103.         print(f"  Loop:        {t1:.6f}s")
  104.         print(f"  Comprehension: {t2:.6f}s")
  105.         print(f"  Speedup:     {t1/t2:.2f}x\n")
  106.        
  107.         if n <= 100:
  108.             m = 50
  109.             M1 = [[i+j for j in range(m)] for i in range(m)]
  110.             M2 = [[i*j+1 for j in range(m)] for i in range(m)]
  111.            
  112.             print(f"MATRIX MULTIPLY ({m}x{m}):")
  113.             t1 = timeit.timeit(lambda: matrix_mult_loop(M1, M2), number=10)
  114.             t2 = timeit.timeit(lambda: matrix_mult_linalg(M1, M2), number=10)
  115.             print(f"  Nested loops: {t1:.6f}s")
  116.             print(f"  Comprehension: {t2:.6f}s")
  117.             print(f"  Speedup:     {t1/t2:.2f}x\n")
  118.            
  119.             print(f"MATRIX TRANSPOSE ({m}x{m}):")
  120.             t1 = timeit.timeit(lambda: transpose_loop(M1), number=1000)
  121.             t2 = timeit.timeit(lambda: transpose_linalg(M1), number=1000)
  122.             print(f"  Loop:        {t1:.6f}s")
  123.             print(f"  zip(*M):     {t2:.6f}s")
  124.             print(f"  Speedup:     {t1/t2:.2f}x\n")
  125.        
  126.         if n == 100:
  127.             v3 = [1.0, 2.0, 3.0]
  128.             v4 = [4.0, 5.0, 6.0]
  129.             print(f"CROSS PRODUCT (3D):")
  130.             t1 = timeit.timeit(lambda: cross_product_loop(v3, v4), number=10000)
  131.             t2 = timeit.timeit(lambda: cross_product_linalg(v3, v4), number=10000)
  132.             print(f"  Loop:        {t1:.6f}s")
  133.             print(f"  Inline:      {t2:.6f}s")
  134.             print(f"  Speedup:     {t1/t2:.2f}x\n")
  135.    
  136.     print("=" * 70)
  137.     print("SUMMARY: List comprehensions and built-in functions are faster")
  138.     print("         than explicit loops due to optimized C implementations")
  139.     print("=" * 70)
  140.  
  141. run_benchmarks()
Advertisement
Add Comment
Please, Sign In to add comment