Re: Summary: List element manipulation
- To: mathgroup at smc.vnet.net
- Subject: [mg25469] Re: Summary: List element manipulation
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Mon, 2 Oct 2000 22:26:50 -0400 (EDT)
- References: <8r19qf$hvt@smc.vnet.net> <8r6oij$1c@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Martin,
Here are some timings and a new method that is faster on the tests below,
but
which is adversely affected when the structure of the data is more
complicated
than a list of numbers.
data1 = Range[1000000];
Previous methods
MapAt[# - 1 &, data1, -1]; // Timing // First
7.91 Second
data1 /. {h___, t_} -> {h, t - 1}; // Timing // First
8.73 Second
New method
oneOffLast[x_] :=
Module[{y = x}, y[[-1]] = y[[-1]] - 1; y]
oneOffLast[data1]; // Timing // First
0.44 Second
We could use an anonymous function:
Module[{y = #}, y[[-1]] = y[[-1]] - 1; y] &[data1] // Timing // First
0.43 Second
Slightly more complicated data
data2 = Prepend[Range[1000000], {0}];
The previous methods are slightly affected:
MapAt[# - 1 &, data2, -1]; // Timing // First
4.01 Second
data2 /. {h___, t_} -> {h, t - 1}; // Timing // First
6.26 Second
The new one is much slower on data2 than on data1(though still faster than
the previous methods.
oneOffLast[data2]; // Timing // First
2.14 Second
Introducing a symbol has much the same adverse effect on the new method :
Remove[a]
data3 = Prepend[Range[1000000], a];
oneOffLast[data3]; // Timing // First
2.69 Second
--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565
"Martin Rommel" <rommel at semitest.com> wrote in message
news:8r6oij$1c at smc.vnet.net...
> Thanks to the many helpful people that replied with their insight.
> The straightforward fix to my problematic
>
> > MapAt[Decrement, Range[116, 166, 8], -1]
> >
> > Decrement::"rvalue": "164 is not a variable with a value, so its
value
> > cannot be changed."
>
> is using a function # - 1& instead of Decrement (which is not a
mathematical
> function but instead listed under programming assignments in the help
> browser)
>
> MapAt[# - 1&, Range[116, 166, 8], -1]
>
> This was suggested by the news group veterans David Park, Andrzej
Kozlowski,
> Hartmut Wolf and Allan Hayes.
>
> Matt Johnson suggested an alternative using a rule (it is always
interesting
> to see things done differently)
>
> Range[116, 166, 8] /. {h___, t_} -> {h, t - 1}
>
> Special thanks to Andrzej Kozlowski for additonal explainations but the
most
> in depth coverage came from my compatriot Hartmut Wolf.
>
> With hindsight I don't understand why I was so fixated on employing
> Decrement.
>
> Martin
>
>