On Wednesday, March 25, 2015 at 1:52:04 PM UTC-7, Tim Holy wrote: > > 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 >
Ok, got that working, but when I try using it inside the function (which would be closer to what I really need to do): function test_time2(func::Function) fn = @anon x->func(x) sum = 1.0 for i in 1:1000000 sum += fn(sum) end sum end julia> @time test_time2(abs) ERROR: `func` has no method matching func(::Float64) in ##26503 at /home/phil/.julia/v0.3/FastAnonymous/src/FastAnonymous.jl:2 in test_time2 at none:5 > --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 > >