-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
46 lines (35 loc) · 1.35 KB
/
main.py
File metadata and controls
46 lines (35 loc) · 1.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import time
import random
import numpy as np
from memory_profiler import memory_usage
def generate_matrix(n, m):
return [[random.random() for _ in range(m)] for _ in range(n)]
def matmul_pure_python(A, B):
n, m, p = len(A), len(B), len(B[0])
result = [[0.0 for _ in range(p)] for _ in range(n)]
for i in range(n):
for j in range(p):
for k in range(m):
result[i][j] += A[i][k] * B[k][j]
return result
def measure_memory_and_time(func, *args):
start_time = time.time()
mem_usage, result = memory_usage((func, args), retval=True, max_usage=True)
end_time = time.time()
duration = end_time - start_time
return duration, mem_usage, result
def benchmark(size):
print(f"\nMatrix Size: {size}x{size}")
# Vanilla Python
A = generate_matrix(size, size)
B = generate_matrix(size, size)
if size > 2000:
print("Pure Python: Time = -NA- s, Peak Mem = -NA- MB")
else:
time_py, mem_py, _ = measure_memory_and_time(matmul_pure_python, A, B)
print(f"Vanilla Python: Time = {time_py:.4f}s, Peak Mem = {mem_py:.2f} MB")
# NumPy
time_np, mem_np, _ = measure_memory_and_time(np.dot, A, B)
print(f"NumPy : Time = {time_np:.4f}s, Peak Mem = {mem_np:.2f} MB")
if __name__ == "__main__":
benchmark(int(input("Enter matrix size to generate: ")))