[R] filling a list faster
Balazs Torma
torma at sztaki.hu
Fri Jul 13 13:26:01 CEST 2007
Thank you all for your answers!
The problem is that I don't know the length of the list in advance!
And hoped for a convinience structure which reallocates once the
preallocated list (or matrix) becomes full.
>> By the way, what is your "very fast machine", that is actually four
>> times faster than mine (grrrrr!)?
I don't know the exact parameters of this machine, I just know its
name is "monster", has 32 GB RAM and >10 CPUs :)
Quoting jim holtman <jholtman at gmail.com>:
> Actually if you are really interested in the list, then just do the
> lapply and compute your data; it seems to be even faster than the
> matrix:
>
>> system.time(l.1 <- lapply(1:10^5, function(i) c(i, i+1, i)))
> user system elapsed
> 0.50 0.00 0.61
>> l.1[1:4]
> [[1]]
> [1] 1 2 1
>
> [[2]]
> [1] 2 3 2
>
> [[3]]
> [1] 3 4 3
>
> [[4]]
> [1] 4 5 4
>
>
>
> On 7/13/07, Philippe Grosjean <phgrosjean at sciviews.org> wrote:
>> If all the data coming from your iterations are numeric (as in your toy
>> example), why not to use a matrix with one row per iteration? Also, do
>> preallocate the matrix and do not add row or column names before the end
>> of the calculation. Something like:
>>
>> > m <- matrix(rep(NA, 3*10^5), ncol = 3)
>> > system.time(for(i in (1:10^5)) m[i, ] <- c(i,i+1,i))
>> user system elapsed
>> 1.362 0.033 1.424
>>
>> That is, about 1.5sec on my Intel Duo Core 2.33Mhz MacBook Pro, compared to:
>>
>> > l <- list("1"<-c(1,2,3))
>> > system.time(for(i in (1:10^5)) l[[length(l)+1]] <- c(i,i+1,i))
>> user system elapsed
>> 191.629 49.110 248.454
>>
>> ... more than 4 minutes for your code.
>>
>> By the way, what is your "very fast machine", that is actually four
>> times faster than mine (grrrrr!)?
>>
>> Best,
>>
>> Philippe Grosjean
>>
>> ..............................................<∞}))><........
>> ) ) ) ) )
>> ( ( ( ( ( Prof. Philippe Grosjean
>> ) ) ) ) )
>> ( ( ( ( ( Numerical Ecology of Aquatic Systems
>> ) ) ) ) ) Mons-Hainaut University, Belgium
>> ( ( ( ( (
>> ..............................................................
>>
>> Balazs Torma wrote:
>>> hello,
>>>
>>> first I create a list:
>>>
>>> l <- list("1"<-c(1,2,3))
>>>
>>> then I run the following cycle, it takes over a minute(!) to
>>> complete on a very fast mashine:
>>>
>>> for(i in (1:10^5)) l[[length(l)+1]] <- c(i,i+1,i)
>>>
>>> How can I fill a list faster? (This is just a demo test, the elements
>>> of the list are calculated iteratively in an algorithm)
>>>
>>> Are there any packages and documents on how to use more advanced and
>>> fast data structures like linked-lists, hash-tables or trees for
>>> example?
>>>
>>> Thank you,
>>> Balazs Torma
>>>
>>> ______________________________________________
>>> R-help at stat.math.ethz.ch mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>>
>> ______________________________________________
>> R-help at stat.math.ethz.ch mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
>
> --
> Jim Holtman
> Cincinnati, OH
> +1 513 646 9390
>
> What is the problem you are trying to solve?
More information about the R-help
mailing list