time series calculation in list comprehension?
Raymond Hettinger
python at rcn.com
Sun Mar 12 11:18:23 EST 2006
[Peter Otten]
> from __future__ import division
>
> from itertools import islice, tee, izip
. . .
> def moving_average2(items, n):
> first_items, last_items = tee(items)
> accu = sum(islice(last_items, n-1))
> for first, last in izip(first_items, last_items):
> accu += last
> yield accu/n
> accu -= first
>
> While moving_average1() is even slower than your inefficient variant,
> moving_average2() seems to be a tad faster than the efficient one.
This is nicely done and scales-up well. Given an n-average of m-items,
it has O(n) memory consumption and O(m) running time. In contrast, the
other variants do more work than necessary by pulling the whole
sequence into memory or by re-summing all n items at every step,
resulting in O(m) memory consumption and O(m*n) running time.
This recipe gets my vote for the best solution.
Raymond
More information about the Python-list
mailing list