8
8
import symengine as se
9
9
import warnings
10
10
11
- exprs_s = open (os .path .join (os .path .dirname (__file__ ), '6_links_rhs.txt' ), 'tr' ).read ()
12
- exprs = parse_expr (exprs_s , transformations = standard_transformations )
13
- args = sp .Matrix (1 , 14 , exprs ).free_symbols
11
+ src = os .path .join (os .path .dirname (__file__ ), '6_links_rhs.txt' )
12
+ serial = open (src , 'tr' ).read ()
13
+ parsed = parse_expr (serial , transformations = standard_transformations )
14
+ vec = sp .Matrix (1 , 14 , parsed )
15
+ args = tuple (sorted (vec .free_symbols , key = lambda arg : arg .name ))
16
+ exprs = vec , vec .jacobian (args [:- 14 ])
14
17
inp = np .ones (len (args ))
15
18
assert inp .size == 26
16
- print ([expr .subs (dict (zip (args , [1 ]* len (args )))) for expr in exprs ])
17
19
18
- # Real-life example (ion speciation problem in water chemistry)
19
20
20
-
21
- lmb_sp = sp .lambdify (args , exprs , modules = 'math' )
22
- lmb_se = se .Lambdify (args , exprs )
23
- # lmb_se_cse = se.LambdifyCSE(args, exprs)
24
- lmb_se_llvm = se .Lambdify (args , exprs , backend = 'llvm' )
21
+ lmb_sp = sp .lambdify (args , exprs , modules = ['math' , 'sympy' ])
22
+ lmb_se = se .Lambdify (args , * exprs )
23
+ lmb_se_llvm = se .Lambdify (args , * exprs , backend = 'llvm' )
25
24
26
25
27
26
lmb_sp (* inp )
28
27
tim_sympy = clock ()
29
28
for i in range (500 ):
30
- res_sympy = lmb_sp (* inp )
29
+ v , m = lmb_sp (* inp )
31
30
tim_sympy = clock () - tim_sympy
32
31
33
32
lmb_se (inp )
34
33
tim_se = clock ()
35
- res_se = np .empty (len (exprs ))
36
34
for i in range (500 ):
37
- res_se = lmb_se (inp )
35
+ v , m = lmb_se (inp )
38
36
tim_se = clock () - tim_se
39
37
40
- # lmb_se_cse(inp)
41
- # tim_se_cse = clock()
42
- # res_se_cse = np.empty(len(exprs))
43
- # for i in range(500):
44
- # res_se_cse = lmb_se_cse(inp)
45
- # tim_se_cse = clock() - tim_se_cse
46
38
47
39
lmb_se_llvm (inp )
48
40
tim_se_llvm = clock ()
49
41
res_se_llvm = np .empty (len (exprs ))
50
42
for i in range (500 ):
51
- res_se_llvm = lmb_se_llvm (inp )
43
+ v , m = lmb_se_llvm (inp )
52
44
tim_se_llvm = clock () - tim_se_llvm
53
45
54
46
55
47
print ('SymEngine (lambda double) speed-up factor (higher is better) vs sympy: %12.5g' %
56
48
(tim_sympy / tim_se ))
57
49
58
- # print('symengine (lambda double + CSE) speed-up factor (higher is better) vs sympy: %12.5g' %
59
- # (tim_sympy/tim_se_cse))
60
50
61
51
print ('symengine (LLVM) speed-up factor (higher is better) vs sympy: %12.5g' %
62
52
(tim_sympy / tim_se_llvm ))
@@ -80,28 +70,14 @@ def func(*args):
80
70
return result
81
71
return func
82
72
83
- lmb_se_llvm_manual = ManualLLVM (args , np . array ( exprs ) )
73
+ lmb_se_llvm_manual = ManualLLVM (args , * exprs )
84
74
lmb_se_llvm_manual (inp )
85
75
tim_se_llvm_manual = clock ()
86
- res_se_llvm_manual = np .empty (len (exprs ))
87
76
for i in range (500 ):
88
- res_se_llvm_manual = lmb_se_llvm_manual (inp )
77
+ v , m = lmb_se_llvm_manual (inp )
89
78
tim_se_llvm_manual = clock () - tim_se_llvm_manual
90
79
print ('symengine (ManualLLVM) speed-up factor (higher is better) vs sympy: %12.5g' %
91
80
(tim_sympy / tim_se_llvm_manual ))
92
81
93
82
if tim_se_llvm_manual < tim_se_llvm :
94
83
warnings .warn ("Cython code for Lambdify.__call__ is slow." )
95
-
96
- import setuptools
97
- import pyximport
98
- pyximport .install ()
99
- from Lambdify_6_links_reference import _benchmark_reference_for_Lambdify as lmb_ref
100
-
101
- lmb_ref (inp )
102
- tim_ref = clock ()
103
- for i in range (500 ):
104
- res_ref = lmb_ref (inp )
105
- tim_ref = clock () - tim_ref
106
- print ('Hard-coded Cython code speed-up factor (higher is better) vs sympy: %12.5g' %
107
- (tim_sympy / tim_ref ))
0 commit comments