Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot

Re: Fastest way to "pick without replacement"

by Eily (Monsignor)
on Nov 20, 2020 at 15:37 UTC ( #11123905=note: print w/replies, xml ) Need Help??

in reply to Fastest way to "pick without replacement"

If you don't care about order, replacing the deleted element by the last in the array works as well. And I was expecting it to be faster than splice (since I was expecting the latter to move every element after the one that is removed) but the performances are actually very similar:

use warnings; use strict; use Benchmark qw/cmpthese/; my $size = 1e3; my @numbers = ( 0..$size ); my $index = 3; my @expect = ( 0..2,4..$size ); use constant TEST => 0; cmpthese(-2, { splice => sub { my @output = @numbers; splice @output, $index, 1; join("\0", sort @output) eq join("\0", sort @expect) or die if TES +T; }, grep => sub { # my @output = @numbers[ grep $_ != $index, 0 .. $#numbers ]; join("\0", sort @output) eq join("\0", sort @expect) or die if TES +T; }, swap => sub { my @output = @numbers; $output[$index] = pop @output; join("\0", sort @output) eq join("\0", sort @expect) or die if TES +T; }, });
C:\Projets\perl>perl Rate grep swap splice grep 14287/s -- -73% -73% swap 52519/s 268% -- -0% splice 52549/s 268% 0% --

NB: I checked, it works fine when $index is the last element in the array as well.

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11123905]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (2)
As of 2023-03-27 00:23 GMT
Find Nodes?
    Voting Booth?
    Which type of climate do you prefer to live in?

    Results (63 votes). Check out past polls.