Thread overview
equivalent of python join?
Dec 03, 2013
CJS
Dec 03, 2013
Jacob Carlborg
Dec 03, 2013
Ali Çehreli
December 03, 2013
In python a common performance tip for joining many strings together is to use the join method. So, for example, instead of
"a" + "b" + "c"
use
''.join(["a","b","c"]).
The idea is to avoid creating temporary objects that are immediately thrown away. It's obviously overkill for such a small number of strings, though.

Is there any equivalent method/advice when concatenating many strings together in D?
December 03, 2013
On 2013-12-03 07:36, CJS wrote:
> In python a common performance tip for joining many strings together is
> to use the join method. So, for example, instead of
> "a" + "b" + "c"
> use
> ''.join(["a","b","c"]).
> The idea is to avoid creating temporary objects that are immediately
> thrown away. It's obviously overkill for such a small number of strings,
> though.
>
> Is there any equivalent method/advice when concatenating many strings
> together in D?

There's std.algorithm.joiner[1] and std.array.join[2]. I don't know if they're any more efficient than using "~". There's also std.array.Appender[3] if you want to do a lot of appending and want the most efficient way.

[1] http://dlang.org/phobos/std_algorithm.html#joiner
[2] http://dlang.org/phobos/std_array.html#.join
[3] http://dlang.org/phobos/std_array.html#.Appender

-- 
/Jacob Carlborg
December 03, 2013
On 12/02/2013 11:32 PM, Jacob Carlborg wrote:

> On 2013-12-03 07:36, CJS wrote:
>> In python a common performance tip for joining many strings together is
>> to use the join method. So, for example, instead of
>> "a" + "b" + "c"
>> use
>> ''.join(["a","b","c"]).
>> The idea is to avoid creating temporary objects that are immediately
>> thrown away. It's obviously overkill for such a small number of strings,
>> though.
>>
>> Is there any equivalent method/advice when concatenating many strings
>> together in D?
>
> There's std.algorithm.joiner[1] and std.array.join[2]. I don't know if
> they're any more efficient than using "~".

They are more efficient in the sense that they are lazy.

> There's also
> std.array.Appender[3] if you want to do a lot of appending and want the
> most efficient way.
>
> [1] http://dlang.org/phobos/std_algorithm.html#joiner
> [2] http://dlang.org/phobos/std_array.html#.join
> [3] http://dlang.org/phobos/std_array.html#.Appender

There is also the more general std.range.chain. It can join any type of range as long as the element types are the same:

import std.stdio;
import std.range;
import std.algorithm;

void main()
{
    auto a_lazy_range_of_ints
        = chain(5.iota,
                [ 10, 9, 20, 8 ].filter!(a => a < 10));

    // writeln consumes the range eagerly
    writeln(a_lazy_range_of_ints);

    // Prints [0, 1, 2, 3, 4, 9, 8]
}

Ali