Skip to content

Commit 120120b

Browse files
committed
Compare array access pattern performance
1 parent 780d039 commit 120120b

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

array_access_patterns.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
2+
import gc
3+
import numpy as np
4+
import time
5+
6+
# contiguous_array[i-1]
7+
# contiguous_array[i]
8+
# contiguous_array[i+1]
9+
# new_array1 = np.ones(np.shape(contiguous_array))
10+
11+
print("Configuration")
12+
# Python float is 64 bit / 8 byte
13+
ARRAY_SIZE = 1000 * 1000 * 1
14+
print("- Size of data array: {} MB".format(ARRAY_SIZE * 8 / (1000 * 1000)))
15+
16+
N = 10
17+
print("- Number of iterations to average: {}".format(N))
18+
19+
def SETUP():
20+
array1 = np.ones(ARRAY_SIZE)
21+
array2 = np.ones(ARRAY_SIZE)
22+
buffer_array = np.empty(ARRAY_SIZE)
23+
return array1, array2, buffer_array
24+
25+
26+
if __name__=="__main__":
27+
# gc.disable()
28+
29+
print("{:45}{:<15}{:<15}".format("Case description", "Total time", "Per-iteration time"))
30+
31+
array1, array2, buffer_array = SETUP()
32+
index_map = np.random.randint(0, ARRAY_SIZE - 1, size=ARRAY_SIZE)
33+
elapsed_time = 0.0
34+
for _ in range(N):
35+
start = time.time()
36+
37+
for i in index_map:
38+
buffer_array[i] = array1[i] + array2[i]
39+
40+
end = time.time()
41+
elapsed_time += end - start
42+
average = elapsed_time / N
43+
print("{:45}{:<15.6f}{:<15.6f}".format("Non-contiguous access, no vectorization", elapsed_time, average))
44+
45+
46+
array1, array2, buffer_array = SETUP()
47+
elapsed_time = 0.0
48+
for _ in range(N):
49+
start = time.time()
50+
51+
for i in range(ARRAY_SIZE):
52+
buffer_array[i] = array1[i] + array2[i]
53+
54+
end = time.time()
55+
elapsed_time += end - start
56+
average = elapsed_time / N
57+
print("{:45}{:<15.6f}{:<15.6f}".format("Contiguous access, no vectorization", elapsed_time, average))
58+
59+
60+
array1, array2, buffer_array = SETUP()
61+
index_map = np.random.randint(0, ARRAY_SIZE - 1, size=ARRAY_SIZE)
62+
elapsed_time = 0.0
63+
for _ in range(N):
64+
start = time.time()
65+
66+
buffer_array = array1[index_map] + array2[index_map]
67+
68+
end = time.time()
69+
elapsed_time += end - start
70+
average = elapsed_time / N
71+
print("{:45}{:<15.6f}{:<15.6f}".format("Non-contiguous access, vectorization", elapsed_time, average))
72+
73+
74+
array1, array2, buffer_array = SETUP()
75+
index_map = np.arange(0, ARRAY_SIZE)
76+
elapsed_time = 0.0
77+
for _ in range(N):
78+
start = time.time()
79+
80+
buffer_array = array1[index_map] + array2[index_map]
81+
82+
end = time.time()
83+
elapsed_time += end - start
84+
average = elapsed_time / N
85+
print("{:45}{:<15.6f}{:<15.6f}".format("Contiguous access, vectorization", elapsed_time, average))

0 commit comments

Comments
 (0)