-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbench-structured.py
More file actions
89 lines (74 loc) · 2.65 KB
/
bench-structured.py
File metadata and controls
89 lines (74 loc) · 2.65 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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#These functions construct the different types of lists we will benchmark
funcs = []
def backslash_sort(n):
L = list(range(n))
L.reverse()
return L
funcs.append(('\sort',backslash_sort))
def slash_sort(n):
random.seed(n)
return list(range(n))
funcs.append(('/sort',slash_sort))
def three_sort(n):
random.seed(n)
L = list(range(n))
for _ in range(3):
a = random.randint(0,n-1); b = random.randint(0,n-1)
L[a], L[b] = L[b], L[a]
return L
funcs.append(('3sort',three_sort))
def plus_sort(n):
random.seed(n)
return (list(range(n)) +
[random.randint(0,n-1) for _ in range(10)])
funcs.append(('+sort',plus_sort))
def percent_sort(n):
random.seed(n)
L = list(range(n))
for _ in range(n//100):
L[random.randint(0,n-1)] = random.randint(0,n-1)
return L
funcs.append(('%sort',percent_sort))
def tilde_sort(n):
random.seed(n)
L = [0]*(n//4) + [1]*(n//4) + [2]*(n//4) + [3]*(n//4)
random.shuffle(L)
return L
funcs.append(('~sort',tilde_sort))
def equal_sort(n):
return [0]*n
funcs.append(('=sort',equal_sort))
#This is the main benchmark loop
#stdout_redirector from:
#https://raw.githubusercontent.com/berkerpeksag/python-playground/master/stdout_redirector.py
from stdout_redirector import stdout_redirector
import io, random, re
def run_benchmark(iterations,start_size,step,end_size):
homogeneous_times = {label:[] for (label,func) in funcs};
heterogeneous_times = {label:[] for (label,func) in funcs};
print("Benchmark started")
for iteration in range(iterations):
print("{}%".format(100*iteration/iterations))
for (label,func) in funcs:
homogeneous_time = 0
heterogeneous_time = 0
for n in range(start_size,end_size,step):
stdout_capture = io.BytesIO()
with stdout_redirector(stdout_capture):
func(n).sort()
(func(n)+[0.0]).sort()
(homogeneous,
heterogeneous) = re.match('SORT TIME: (\d+)\nSORT TIME: (\d+)',
stdout_capture.getvalue().\
decode('utf-8')).groups()
homogeneous_time += int(homogeneous)
heterogeneous_time += int(heterogeneous)
homogeneous_times[label].append(homogeneous_time)
heterogeneous_times[label].append(heterogeneous_time)
print("Benchmark ended")
return times
def main():
import pickle,sys
pickle.dump(run_benchmark(500,1000,100,10000), open(sys.argv[1],'wb'))
if __name__ == '__main__':
main()