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 
>
>

Reply via email to