No, it's
f = @anon x->abs(x)
and then pass f to test_time. Declare the function like this:
function test_time{F}(func::F)
....
end
--Tim
On Wednesday, March 25, 2015 01:30:28 PM Phil Tomson wrote:
> On Wednesday, March 25, 2015 at 1:08:24 PM UTC-7, Tim Holy wrote:
> > Don't use a macro, just use the @anon macro to create an object that will
> > be
> > fast to use as a "function."
>
> I guess I'm not understanding how this is used, I would have thought I'd
> need to do something like:
>
> julia>
> function test_time(func::Function)
> f = @anon func
> sum = 1.0
> for i in 1:1000000
> sum += f(sum)
> end
> sum
> end
> ERROR: `anonsplice` has no method matching anonsplice(::Symbol)
>
>
> ... or even trying it outside of the function:
> julia> f = @anon abs
> ERROR: `anonsplice` has no method matching anonsplice(::Symbol)
>
> > --Tim
> >
> > On Wednesday, March 25, 2015 01:00:27 PM Phil Tomson wrote:
> > > I have a couple of instances where a function is determined by some
> > > parameters (in a JSON file in this case) and I have to call it in this
> > > manner. I'm thinking it should be possible to speed these up via a
> >
> > macro,
> >
> > > but I'm a macro newbie. I'll probably post a different question related
> >
> > to
> >
> > > that, but would a macro be feasible in an instance like this?
> > >
> > > On Wednesday, March 25, 2015 at 12:35:20 PM UTC-7, Tim Holy wrote:
> > > > There have been many prior posts about this topic. Maybe we should add
> >
> > a
> >
> > > > FAQ
> > > > page we can direct people to. In the mean time, your best bet is to
> >
> > search
> >
> > > > (or
> > > > use FastAnonymous or NumericFuns).
> > > >
> > > > --Tim
> > > >
> > > > On Wednesday, March 25, 2015 11:41:10 AM Phil Tomson wrote:
> > > > > Maybe this is just obvious, but it's not making much sense to me.
> > > > >
> > > > > If I have a reference to a function (pardon if that's not the
> >
> > correct
> >
> > > > > Julia-ish terminology - basically just a variable that holds a
> >
> > Function
> >
> > > > > type) and call it, it runs much more slowly (persumably because it's
> > > > > allocating a lot more memory) than it would if I make the same call
> >
> > with
> >
> > > > > the function directly.
> > > > >
> > > > > Maybe that's not so clear, so let me show an example using the abs
> > > >
> > > > function:
> > > > > function test_time()
> > > > >
> > > > > sum = 1.0
> > > > > for i in 1:1000000
> > > > >
> > > > > sum += abs(sum)
> > > > >
> > > > > end
> > > > > sum
> > > > >
> > > > > end
> > > > >
> > > > > Run it a few times with @time:
> > > > > julia> @time test_time()
> > > > >
> > > > > elapsed time: 0.007576883 seconds (96 bytes allocated)
> > > > > Inf
> > > > >
> > > > > julia> @time test_time()
> > > > >
> > > > > elapsed time: 0.002058207 seconds (96 bytes allocated)
> > > > > Inf
> > > > >
> > > > > julia> @time test_time()
> > > > > elapsed time: 0.005015882 seconds (96 bytes allocated)
> > > > > Inf
> > > > >
> > > > > Now let's try a modified version that takes a Function on the input:
> > > > > function test_time(func::Function)
> > > > >
> > > > > sum = 1.0
> > > > > for i in 1:1000000
> > > > >
> > > > > sum += func(sum)
> > > > >
> > > > > end
> > > > > sum
> > > > >
> > > > > end
> > > > >
> > > > > So essentially the same function, but this time the function is
> >
> > passed
> >
> > > > in.
> > > >
> > > > > Running this version a few times:
> > > > > julia> @time test_time(abs)
> > > > > elapsed time: 0.066612994 seconds (32000080 bytes allocated,
> >
> > 31.05%
> >
> > > > > gc time)
> > > > >
> > > > > Inf
> > > > >
> > > > > julia> @time test_time(abs)
> > > > > elapsed time: 0.064705561 seconds (32000080 bytes allocated,
> >
> > 31.16%
> >
> > > > gc
> > > >
> > > > > time)
> > > > >
> > > > > Inf
> > > > >
> > > > > So roughly 10X slower, probably because of the much larger amount of
> > > >
> > > > memory
> > > >
> > > > > allocated (32000080 bytes vs. 96 bytes)
> > > > >
> > > > > Why does the second version allocate so much more memory? (I'm
> >
> > running
> >
> > > > > Julia 0.3.6 for this testcase)
> > > > >
> > > > > Phil