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

Reply via email to