NAME List::Helpers::XS - Perl extension to provide some usefull functions with arrays SYNOPSIS use List::Helpers::XS qw/ :shuffle :slice /; my $slice = random_slice(\@list, $size); # returns array reference random_slice_void(\@list, $size); shuffle(\@list); shuffle(@list); # undef value will be skipped shuffle_multi(\@list1, \@list2, undef, \@list3); # the same for tied arrays tie(@list, "MyPackage"); shuffle(@list); shuffle(\@list); random_slice_void(\@list, $size); my $slice = random_slice(\@list, $size); # returns array reference DESCRIPTION This module provides some rare but usefull functions to work with arrays. It supports tied arrays. random_slice This method receives the array and the amount of required elements to be shuffled, shuffles array's elements and returns the array reference to the new arrays with "num" elements from original one. If "num" is equal or higher than amount of elements in array, then it won't do any work. It doesn't shuffle the whole array, it shuffles only "num" elements and returns only them. So, if you need to shuffle and get back only a part of array, then this method can be faster than others approaches. Be aware that the original array will be shuffled too, but it won't be sliced. random_slice_void This method receives the array and the amount of required elements to be shuffled, shuffles array's elements. Doesn't return anything. After method being called the passed array will contain only random "num" elements from the original array. This method is a memory efficient, but it can a bit slow down in case of huge arrays and "num". In this case please consider the usage of "random_slice" method. shuflle Shuffles the provided array. Doesn't return anything. shuffle_multi Shuffles multiple arrays. Each array must be passed as array reference. All undefined arrays will be skipped. This method will allow you to save some time by getting rid of extra calls. You can pass so many arguments as Perl stack allows. Benchmarks Below you can find some benchmarks of "random_slice" and "random_slice_void" methods in comparison with "Array::Shuffle::shuffle_array" / "Array::Shuffle::shuffle_huge_array" with "splice" method invocation afterwards. Total amount of elements in initial array: 250 shuffle_array and splice random_slice random_slice_void shuffle_array and splice -- -45% -52% random_slice 82% -- -12% random_slice_void 107% 14% -- Total amount of elements in initial array: 25_000 shuffle_array and splice random_slice_void random_slice shuffle_array and splice -- -51% -56% random_slice_void 106% -- -9% random_slice 126% 10% -- Total amount of elements in initial array: 250_000 shuffle_array and splice random_slice_void random_slice shuffle_array and splice -- -63% -67% random_slice_void 172% -- -9% random_slice 200% 10% -- The benchmark code is below: cmpthese ( 1_000_000, { 'shuffle_array and splice' => sub { my $arr = [@array]; if ($slice_size < scalar $arr->@*) { shuffle_array(@$arr); $arr = [splice(@$arr, 0, $slice_size)]; } }, 'random_slice' => sub { my $arr = [@array]; $arr = random_slice($arr, $slice_size); }, 'random_slice_void' => sub { my $arr = [@array]; random_slice_void($arr, $slice_size); }, } ); The benchmark results for "shuffle" method shuffle_huge_array List::Helpers::XS::shuffle shuffle_huge_array -- -5% List::Helpers::XS::shuffle 5% -- shuffle_array List::Helpers::XS::shuffle shuffle_array -- -4% List::Helpers::XS::shuffle 4% -- List::Util::shuffle List::Helpers::XS::shuffle List::Util::shuffle -- -63% List::Helpers::XS::shuffle 170% -- AUTHOR Chernenko Dmitriy, cdn@cpan.org COPYRIGHT AND LICENSE Copyright (C) 2021 by Dmitriy This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.26.1 or, at your option, any later version of Perl 5 you may have available.