in reply to Re: Best way to sum an array?
in thread Best way to sum an array?

I would say you really don't need to worry about either speed or accuracy of summation in "normal" circumstances.

Often the question "Which is the fastest way" can be translated into "The way I doing it now is really slow; how can I improve it."

With List::Util::sum() running 100x faster than the best pure perl equivalent, why wouldn't you use it even if you don't need the speed; and for some of the methods attempted by beginners and even experienced programmers new to Perl -- eg. the recursive solution in the OP -- sum() can be almost 1000 times faster. Perl sucks at recursion.


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority". The enemy of (IT) success is complexity.
In the absence of evidence, opinion is indistinguishable from prejudice. Suck that fhit

Replies are listed 'Best First'.
Re^3: Best way to sum an array?
by hippo (Archbishop) on May 25, 2017 at 12:54 UTC
    With List::Util::sum() running 100x faster than the best pure perl equivalent, why wouldn't you use it even if you don't need the speed

    It's a good question. The only answer which springs to mind is that you want to avoid loading List::Util in the first place because:

    • You're in a constrained environment and don't have the RAM to spare
    • You are actually concerned about speed but it's faster to run a short script without loading List::Util if the arrays being summed are tiny
    • You are in some environment where XS isn't feasible so you're stuck with the PP version (although this still isn't really a reason not to use it on its own)

    They are all edge cases anyway. And of course if you are one of the 99% who do have enough RAM etc. to load List::Util you get all the other good stuff in that module other than sum() essentially for free.

    In summary: yes, I'd use it everywhere unless there's a demonstrable penalty.

      You are actually concerned about speed but it's faster to run a short script without loading List::Util if the arrays being summed are tiny

      Hm.

      1. constrained environment: I guess 600k might make a difference somewhere.

        Hard to see where though. Most phones have 4GB and even the original Raspberry Pi had 512MB.

      2. "faster ... without loading List::Util: Given WithListUtil.pl:
        #! perl -sl use List::Util qw[ sum ]; our $N //= 10; print sum( 1 .. $N );

        And WithoutListUtil.pl:

        #! perl -sl #use List::Util qw[ sum ]; our $N //= 10; my $t = 0; $t += $_ for 1 .. $N; print $t;

        Darned if I can find any significant difference for as few as 3 numbers to add. Pretty consistently 4-5/100ths for both to start perl, count the numbers and return to the prompt:

        [16:27:32.60] C:\test>for /l %i in (1,1,10) do WithListUtil.pl -N=3 [16:27:55.68] C:\test>WithListUtil.pl -N=3 [16:27:55.73] C:\test>WithListUtil.pl -N=3 [16:27:55.79] C:\test>WithListUtil.pl -N=3 [16:27:55.85] C:\test>WithListUtil.pl -N=3 [16:27:55.90] C:\test>WithListUtil.pl -N=3 [16:27:55.95] C:\test>WithListUtil.pl -N=3 [16:27:56.00] C:\test>WithListUtil.pl -N=3 [16:27:56.05] C:\test>WithListUtil.pl -N=3 [16:27:56.10] C:\test>WithListUtil.pl -N=3 [16:27:56.15] C:\test>WithListUtil.pl -N=3 [16:27:56.20] C:\test>for /l %i in (1,1,10) do WithoutListUtil.pl -N=3 [16:28:22.44] C:\test>WithoutListUtil.pl -N=3 [16:28:22.49] C:\test>WithoutListUtil.pl -N=3 [16:28:22.54] C:\test>WithoutListUtil.pl -N=3 [16:28:22.59] C:\test>WithoutListUtil.pl -N=3 [16:28:22.63] C:\test>WithoutListUtil.pl -N=3 [16:28:22.67] C:\test>WithoutListUtil.pl -N=3 [16:28:22.71] C:\test>WithoutListUtil.pl -N=3 [16:28:22.76] C:\test>WithoutListUtil.pl -N=3 [16:28:22.80] C:\test>WithoutListUtil.pl -N=3 [16:28:22.84] C:\test>WithoutListUtil.pl -N=3 [16:28:22.88] C:\test>

        It's hard to see the loading time of List::Util being a significant factor in any real code.

      3. XS isn't feasible so you're stuck with the PP version:

        I thought it came with the core for most distributions. I 'spose someone somewhere might be running a bastardized, cut-down version.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority". The enemy of (IT) success is complexity.
      In the absence of evidence, opinion is indistinguishable from prejudice. Suck that fhit
        Darned if I can find any significant difference for as few as 3 numbers to add. Pretty consistently 4-5/100ths for both to start perl, count the numbers and return to the prompt

        Interesting. Using precisely your 2 scripts, I see the withListUtil.pl taking about 60-70% longer.

        $ time for i in {1..1000}; do perl withListUtil.pl > /dev/null; done real 0m6.512s user 0m3.820s sys 0m2.867s $ time for i in {1..1000}; do perl withoutListUtil.pl > /dev/null; don +e real 0m3.880s user 0m1.538s sys 0m2.497s

        For the record, this is perl v5.20.3 with List::Util v1.42 on 64-bit Linux.

    • You want to learn about algorithms and Perl's limitations?