Steve D'Aprano <steve+pyt...@pearwood.info> writes: > It's quite clever, actually, in that it gives *pseudo* random-access > with lazy evaluation. You can evaluate the Nth element without > evaluating the earlier ones. But you can't do so without *storing* the > previous ones, they have to be allocated, with only the actual > evaluation being delayed.
Look at any of the memoization packages for ways around that. Or of course you could just write a function instead of a list... > In Haskell, you cannot get the last N elements of a list without > allocating memory for the previous ones. lastn n xxs@(x:xs) | length (take n xs) == n-1 = xxs | otherwise = lastn n xs main = print . lastn 5 $ [1..10000000] *Main> main [9999996,9999997,9999998,9999999,10000000] works for me. The 10000000 list nodes all get allocated, but are immediately freed, so only 5 cells have to be in memory at a time. In principle a fancy enough compiler optimization could get rid of all the allocation completely. -- https://mail.python.org/mailman/listinfo/python-list