-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbenchmark.py
78 lines (64 loc) · 1.97 KB
/
benchmark.py
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
from __future__ import print_function
import tinyarray
import numpy
from time import time
################################################################
# Mock a numpy like "module" using Python tuples.
def tuple_array(seq):
return tuple(seq)
def tuple_zeros(shape, dtype):
return (dtype(0),) * shape
def tuple_dot(a, b):
return a[0] * b[0] + a[1] * b[1]
class Empty:
pass
tuples = Empty()
tuples.__name__ = 'tuples'
tuples.array = tuple_array
tuples.zeros = tuple_zeros
tuples.dot = tuple_dot
################################################################
def zeros(module, dtype, n=100000):
zeros = module.zeros
return list(zeros(2, dtype) for i in range(n))
def make_from_list(module, dtype, n=100000):
array = module.array
l = [dtype(e) for e in range(3)]
return list(array(l) for i in range(n))
def dot(module, dtype, n=1000000):
dot = module.dot
a = module.zeros(2, dtype)
b = module.zeros(2, dtype)
for i in range(n):
c = dot(a, b)
def dot_tuple(module, dtype, n=100000):
dot = module.dot
a = module.zeros(2, dtype)
b = (dtype(0),) * 2
for i in range(n):
c = dot(a, b)
def compare(function, modules):
print('{}:'.format(function.__name__))
for module in modules:
# Execute the function once to make the following timings more
# accurate.
function(module, int)
print(" {:15} ".format(module.__name__), end='')
for dtype in (int, float, complex):
t = time()
try:
function(module, dtype)
except:
print(" failed ", end='')
else:
print(' {:.4f} s '.format(time() - t), end='')
print()
def main():
print(' int float complex')
modules = [tuples, tinyarray, numpy]
compare(zeros, modules)
compare(make_from_list, modules)
compare(dot, modules)
compare(dot_tuple, modules)
if __name__ == '__main__':
main()