With the ``polys.ring`` data structure substitutions are done with ``compose``, which is faster than using ``subs`` with SymPy expressions if one is interested in distributed polynomials.
On Tuesday, April 9, 2013 5:44:31 PM UTC+2, ThanhVu Nguyen wrote: > > So indeed things become much much faster using GMPY ground types. > > Another speed related question is doing expression substituion, i.e > expr.subs(dict). This subs operation is very slow comparing to Sage. In > my case I often have to do this task which instantiates an expression with > hundred of thousand of data and this takes lots of time. For example, > [(x**3 + y**2 + z + 3).subs(d) for d in big_data_set]. Is there some way > to do this more efficiently ? Like using different data structure than > Expression ? > > Thanks, > > > > In [2]: %time bench_solvers.time_solve_lin_sys_165x165() > CPU times: user 4.02 s, sys: 0.15 s, total: 4.17 s > Wall time: 4.08 s > > In [3]: %time bench_solvers.time_eqs_165x165() > CPU times: user 0.94 s, sys: 0.09 s, total: 1.03 s > Wall time: 0.96 s > > In [4]: %time bench_solvers.time_verify_sol_165x165() > CPU times: user 7.04 s, sys: 0.04 s, total: 7.09 s > Wall time: 7.08 s > > In [5]: %time bench_solvers.time_to_expr_eqs_165x165() > CPU times: user 6.34 s, sys: 0.14 s, total: 6.49 s > Wall time: 6.41 s > > > > > On Tuesday, April 9, 2013 12:15:33 AM UTC-6, Aaron Meurer wrote: >> >> These are my timings: >> >> gmpy ground types: >> >> In [19]: from sympy.polys.benchmarks import bench_solvers >> >> In [20]: %time _ = bench_solvers.time_eqs_165x165() >> CPU times: user 590 ms, sys: 86.9 ms, total: 677 ms >> Wall time: 625 ms >> >> In [21]: %time _ = bench_solvers.time_to_expr_eqs_165x165() >> CPU times: user 4.01 s, sys: 149 ms, total: 4.16 s >> Wall time: 4.08 s >> >> In [22]: %time _ = bench_solvers.time_verify_sol_165x165() >> CPU times: user 4.66 s, sys: 106 ms, total: 4.76 s >> Wall time: 4.69 s >> >> In [23]: %time _ = bench_solvers.time_solve_lin_sys_165x165() >> CPU times: user 2.95 s, sys: 192 ms, total: 3.15 s >> Wall time: 3.02 s >> >> Python ground types >> >> In [1]: from sympy.polys.benchmarks import bench_solvers >> >> In [2]: %time _ = bench_solvers.time_eqs_165x165() >> CPU times: user 975 ms, sys: 154 ms, total: 1.13 s >> Wall time: 1.03 s >> >> In [3]: %time _ = bench_solvers.time_to_expr_eqs_165x165() >> CPU times: user 4.98 s, sys: 113 ms, total: 5.09 s >> Wall time: 5.03 s >> >> In [4]: %time _ = bench_solvers.time_verify_sol_165x165() >> CPU times: user 6.73 s, sys: 64.7 ms, total: 6.79 s >> Wall time: 6.75 s >> >> In [5]: %time _ = bench_solvers.time_solve_lin_sys_165x165() >> CPU times: user 26.2 s, sys: 112 ms, total: 26.4 s >> Wall time: 26.3 s >> >> So the ground types do make a difference, especially in the solve >> times. Note that if gmpy is not installed, it just uses Python ints >> and Fraction for integers and rational numbers (it's likely Fraction >> that is so slow, since it has basic operations like addition and gcd >> implemented in Python loops). >> >> Aaron Meurer >> >> On Tue, Apr 9, 2013 at 12:05 AM, ThanhVu Nguyen >> <[email protected]> wrote: >> > If you want to try it out you have to use >> >> >> >> sparse-polys branch from #1840 pull request. Here is a sample code: >> >> >> >> In [1]: from sympy.polys.benchmarks.bench_solvers import * >> >> >> >> In [2]: %time eqs = eqs_165x165() >> >> CPU times: user 2.12 s, sys: 0.01 s, total: 2.13 s >> >> Wall time: 2.12 s >> >> >> >> In [3]: %time sol = solve_lin_sys(eqs, R_165) >> >> CPU times: user 1.60 s, sys: 0.01 s, total: 1.60 s >> >> Wall time: 1.59 s >> >> >> >> > >> >> > >> > >> > >> > >> > Hi, I just tried the benchmark file from the latest git pull but was >> not >> > able to achieve such good performance . I don't have GMP installed >> so >> > using whatever that sympy uses by default. My test below shows solving >> > these equations takes 32 secs, which is 27 times longer than >> generating >> > them 1.2 s. This contrasts with your stats above which indicates >> solving >> > these equations takes 1.6 s, which is even faster than generating them >> in >> > 2.12s (is it even possible ??). >> > >> > Your solve_lin_sy() function is indeed much faster than the default >> > solve(), taking over 600 s. However when I've tried size 248x248 and >> Sage's >> > solve() still solves under two min but your solve_lin_sys() takes over >> 20 >> > mins, at which point I just gave up and kill the process. (If you >> need >> > these data let me know) >> > >> > >> > All the tests below were done on my MacBook in 2011, 2.3 Ghz i3 with 8 >> GB >> > Ram . Perhaps I should install GMP and try again ? >> > >> > In [1]: import bench_solvers >> > >> > In [2]: %time _ = bench_solvers.time_eqs_165x165() >> > CPU times: user 1.18 s, sys: 0.09 s, total: 1.27 s >> > Wall time: 1.21 s >> > >> > In [3]: %time _ = bench_solvers.time_to_expr_eqs_165x165() >> > CPU times: user 6.10 s, sys: 0.12 s, total: 6.22 s >> > Wall time: 6.16 s >> > >> > In [4]: %time _ = bench_solvers.time_verify_sol_165x165() >> > CPU times: user 8.07 s, sys: 0.05 s, total: 8.12 s >> > Wall time: 8.10 s >> > >> > In [5]: %time _ = bench_solvers.time_solve_lin_sys_165x165() >> > CPU times: user 32.52 s, sys: 0.11 s, total: 32.63 s >> > Wall time: 32.62 s >> > >> > >> > In [7]: eqs = bench_solvers.eqs_165x165() >> > >> > In [8]: eqs_ = [eqt.as_expr() for eqt in eqs] >> > >> > In [11]: from sympy import solve >> > >> > In [9]: %time _ = solve(eqs_,as_dict=True) #default solve() >> > CPU times: user 610.49 s, sys: 2.05 s, total: 612.54 s >> > Wall time: 614.68 s >> > >> > -- >> > You received this message because you are subscribed to the Google >> Groups >> > "sympy" group. >> > To unsubscribe from this group and stop receiving emails from it, send >> an >> > email to [email protected]. >> > To post to this group, send email to [email protected]. >> > Visit this group at http://groups.google.com/group/sympy?hl=en-US. >> > >> > For more options, visit https://groups.google.com/groups/opt_out. >> > >> > >> > -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/sympy?hl=en-US. For more options, visit https://groups.google.com/groups/opt_out.
