Ugly loops versus pretty vectors
The other day, I posted a prototypical example of use of parLapply, somewhat more advanced than the ones in the documentation; see here.
Well, part of the example I gave uses one of my most biggest coding pet peaves, something that I have been fighting against ever since my MatLab days: the dreaded unnecessary for loop. As I was teaching myself the use of the tictoc
library, I thought I would illustrate both.
To keep in the spirit of the example in the post mentioned, we set up variations of up to two parameters, \(\beta\) and \(S_0\). We set base values for these parameters.
We will try different ranges of number of cases.
Now loop on the number of cases. First, clear the tictoc
log, in case it already exists. In each loop, we take note of the time taken to accomplish each group of operations.
The following is adapted from the tictoc
documentation.
Add a few additional pieces of information about timing: the total time in the second case (making the vectors and converting them to lists) as well as acceleration factors when making the vector and in total of the second method.
Finally, use knitr
to make a decent looking table of the results.
Here are the results:
n | loopT | vectT | convT | sumVect | multVect | multSVect |
---|---|---|---|---|---|---|
10,000 | 0.138 | 0.001 | 0.046 | 0.047 | 138.00 | 2.94 |
50,000 | 0.545 | 0.006 | 0.327 | 0.333 | 90.83 | 1.64 |
100,000 | 1.207 | 0.008 | 0.346 | 0.354 | 150.88 | 3.41 |
500,000 | 8.587 | 0.453 | 1.712 | 2.165 | 18.96 | 3.97 |
1,000,000 | 19.130 | 1.597 | 3.832 | 5.429 | 11.98 | 3.52 |
5,000,000 | 122.943 | 4.359 | 22.746 | 27.105 | 28.20 | 4.54 |
10,000,000 | 277.161 | 8.648 | 40.261 | 48.909 | 32.05 | 5.67 |
Clearly, it would be better here to use a parallel version of apply
operating on matrix rows than on lists, since this would not require a further conversion to a list. But the cases are not always this structured.
Ah, yes, one last thing: when \(n\) is large, some of the variables can become quite large (the last matrix by itself is 10.1 Gb). Unless you have pretty decent RAM, don’t try this at home.