Try Formatting.jl? (https://github.com/lindahua/Formatting.jl)
On Wednesday, March 11, 2015 at 7:16:55 AM UTC+7, Dominique Orban wrote: > > This is an old question about computed format strings, but it's still > biting me. I've been following your suggestion and I defined > > print_formatted(fmt, args...) = @eval @printf($fmt, $(args...)) > > Now I am in a situation where fmt is computed inside a function, and my > function executes in roughly 26 seconds when using the above > print_formatted(). If I cheat and pretend I know the format beforehand and > use @printf, the function executes in under one tenth of a second! > > My question: > > Once the format is known, is there a way to take advantage of this fact > performance-wise? What I mean is something of the form > > print_formatted(args...) = @eval @printf($fmt, $(args...)); # now fmt > is known and fixed > > Unfortunately, defining the above after fmt has been computed isn't any > faster than the first print_formatted. Is there a better option? > > Falling back on my old c_printf (that calls libc directly; see a previous > message in this thread) proves to be the fastest option so far after > @printf, with a run time of just under one second. > > Thanks! > > > On Sunday, April 13, 2014 at 6:22:58 PM UTC-4, Stefan Karpinski wrote: >> >> Please don't do this – or if you do and your program is amazingly slow, >> then consider yourself warned. You can define a custom formatting function >> pretty easily: >> >> julia> fmt = "%8.1e" >> "%8.1e" >> >> julia> @eval dofmt(x) = @sprintf($fmt, x) >> dofmt (generic function with 1 method) >> >> julia> dofmt(1) >> " 1.0e+00" >> >> julia> dofmt(123.456) >> " 1.2e+02" >> >> >> The difference is that you compile the function definition with eval >> *once* and then call it many times, rather than calling eval every time you >> want to print something. >> >> >> On Sun, Apr 13, 2014 at 6:17 PM, Mike Innes <[email protected]> wrote: >> >>> It occurs to me that, if you really need this, you can define >>> >>> sprintf(args...) = eval(:@sprintf($(args...))) >>> >>> It's not pretty or ideal in terms of performance, but it will do the job. >>> >>> fmt = "%8.1e" >>> sprintf(fmt, 3.141) #=> " 3.1e+00" >>> >>> On Sunday, 13 April 2014 22:47:12 UTC+1, Dominique Orban wrote: >>>> >>>> So what's the preferred Julia syntax to achieve what I meant here: >>>> >>>> julia> fmt = "%8.1e"; >>>> julia> @sprintf(fmt, 3.1415) >>>> ERROR: first or second argument must be a format string >>>> >>>> >>>> >>>> On Sunday, April 13, 2014 1:31:57 PM UTC-7, John Myles White wrote: >>>>> >>>>> As far as the macro is concerned, the splat isn’t executed: it’s just >>>>> additional syntax that gets taken in as a whole expression. >>>>> >>>>> The contrast between how a function with splatting works and how a >>>>> macro with splatting works might be helpful: >>>>> >>>>> julia> function splat(a, b...) >>>>> println(a) >>>>> println(b) >>>>> return >>>>> end >>>>> splat (generic function with 2 methods) >>>>> >>>>> julia> splat(1, 2, 3) >>>>> 1 >>>>> (2,3) >>>>> >>>>> julia> splat(1, [2, 3]...) >>>>> 1 >>>>> (2,3) >>>>> >>>>> julia> macro splat(a, b...) >>>>> println(a) >>>>> println(b) >>>>> :() >>>>> end >>>>> >>>>> julia> @splat(1, 2, 3) >>>>> 1 >>>>> (2,3) >>>>> () >>>>> >>>>> julia> @splat(1, [2, 3]...) >>>>> 1 >>>>> (:([2,3]...),) >>>>> () >>>>> >>>>> >>>>> — John >>>>> >>>>> On Apr 13, 2014, at 1:20 PM, Jeff Waller <[email protected]> wrote: >>>>> >>>>> > Likewise I am having problems with @sprintf >>>>> > >>>>> > Is this because @sprinf is macro? The shorthand of expanding a >>>>> printf with format the contents of an array is desirable. I would have >>>>> expected the ... operator to take an array of length 2 and turn it into 2 >>>>> arguments. >>>>> > >>>>> > julia> X=[1 2] >>>>> > 1x2 Array{Int64,2}: >>>>> > 1 2 >>>>> > >>>>> > julia> @sprintf("%d%d",1,2) >>>>> > "12" >>>>> > >>>>> > julia> @sprintf("%d%d",X...) >>>>> > ERROR: @sprintf: wrong number of arguments >>>>> > >>>>> > julia> @sprintf("%d%d",(1,2)...) >>>>> > ERROR: @sprintf: wrong number of arguments >>>>> > >>>>> > julia> @sprintf("%d",X...) >>>>> > ERROR: error compiling anonymous: unsupported or misplaced >>>>> expression ... in function anonymous >>>>> > in sprint at io.jl:460 >>>>> > in sprint at io.jl:464 >>>>> > >>>>> > julia> macroexpand(quote @sprintf("%d%d",X...) end) >>>>> > :($(Expr(:error, ErrorException("@sprintf: wrong number of >>>>> arguments")))) >>>>> > >>>>> >>>>> >>
