D for project in computational chemistry
John Colvin via Digitalmars-d
digitalmars-d at puremagic.com
Mon Aug 17 08:43:03 PDT 2015
On Sunday, 16 August 2015 at 13:59:33 UTC, Idan Arye wrote:
> Initially I thought the Python version is so slow because it
> uses `range` instead of `xrange`, but I tried them both and
> they both take about the same, so I guess the Python JIT(or
> even interpreter!) can optimize these allocations away.
>
> BTW - if you want to iterate over a range of numbers in D, you
> can use a foreach loop:
>
> foreach (i; 0 .. l) {
> foreach (j; 0 .. l) {
> foreach (m; 0 .. l) {
> a = a + i * i * 0.7 + j * j * 0.8 + m * m * 0.9;
> }
>
> }
> }
>
> Or, to make it look more like the Python version, you can
> iterate over a range-returning function:
>
> import std.range : iota;
> foreach (i; iota(l)) {
> foreach (j; iota(l)) {
> foreach (m; iota(l)) {
> a = a + i * i * 0.7 + j * j * 0.8 + m * m * 0.9;
> }
>
> }
> }
>
> There are also functions for building ranges from other ranges:
>
> import std.algorithm : cartesianProduct;
> import std.range : iota;
> foreach (i, j, m; cartesianProduct(iota(l), iota(l),
> iota(l))) {
> a = a + i * i * 0.7 + j * j * 0.8 + m * m * 0.9;
> }
>
> Keep in mind though that using these functions, while making
> the code more readable(to those with some experience in D, at
> least), is bad for performance - for my first version I got
> about 5 seconds when building with DMD in debug mode, while for
> the last version I get 13 seconds when building with LDC in
> release mode.
There is a new implementation of cartesianProduct that makes the
performance difference disappear for me with ldc and dmd. It's
not in ldc's phobos yet so I had to copy it manually, but
hopefully it will be in the next release.
More information about the Digitalmars-d
mailing list