From: Robert Klemme Date: 2011-05-12T16:26:50+09:00 Subject: Re: how to make eval() faster? On Thu, May 12, 2011 at 8:08 AM, Zd Yu wrote: > Joel VanderWerf wrote in post #998154: >> On 05/11/2011 09:53 PM, Zd Yu wrote: >>> make it faster? >> Can you eval your formulas into methods, and call the methods on the >> data samples? > > No. I need flexibility, i.e., allow users to define their own formulas > in the configuration file. I believe you did not fully understand what Joel suggested. You do have that flexibility and you need to invoke eval only _once_ per formula (for the initial compilation of the formula) but not for every evaluation. Example: # really too simplistic! formulas = Hash.new do |h, form| expr = form.sub(/\A.*?=\s*/, '') vars = expr.scan(/[a-z]\w*/i).uniq code = "lambda do |#{vars.join(', ')}| #{expr} end" p vars, code h[form] = eval(code) end # test [ 'x = y * 2 + z', 'z = y * x', ].each do |f| puts f 10.times do |i| printf "%s: %d %d => %f\n", f, i, i*2, formulas[f][i, i*2] end end I'd prefer the DSL approach though. Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/