You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Dec 22, 2024. It is now read-only.
Para retornar uma `tibble` do `{tidyverse}` com o `{Rcpp}` é só você notar que uma `tibble` não é nada mais que um `data.frame` com algumas classes extras:
347
+
348
+
```{r tibble}
349
+
df <- tibble::tibble()
350
+
class(df)
351
+
```
352
+
353
+
E aí é só adicionar essas classes num `DataFrame` do `{Rcpp}`:
Pronto seu objeto `DataFrame` quando for retornado ao R será uma `tibble` do `{tidyverse}`.
361
+
344
362
## `{Rcpp}` Sugar
345
363
346
364
Além dos tipos de dados, `{Rcpp}` também tem uma ampla gama de "açúcares" sintáticos (*syntactic sugar*) para as mais variadas operações e funções. Antes de tentar criar algo do zero veja se não há um [`{Rccp}` Sugar para isso já implementado na vinheta](http://dirk.eddelbuettel.com/code/rcpp/Rcpp-sugar.pdf).
@@ -365,19 +383,28 @@ NumericVector mat_mul(const NumericVector& A, const NumericVector& B) {
365
383
}
366
384
```
367
385
368
-
```{r bench-mat_mul}
369
-
n <- 10^3
370
-
X <- matrix(rnorm(n * n), nrow = n)
371
-
372
-
bench::mark(
373
-
R = X %*% X,
374
-
Cpp = mat_mul(X, X),
375
-
check = FALSE
386
+
```{r bench-mat_mul, message=FALSE}
387
+
b1 <- bench::press(
388
+
n = 10^c(2:3),
389
+
{
390
+
X = matrix(rnorm(n * n), nrow = n)
391
+
bench::mark(
392
+
R = X %*% X,
393
+
Cpp = mat_mul(X, X),
394
+
check = FALSE,
395
+
relative = TRUE
396
+
)}
376
397
)
398
+
b1
377
399
```
378
400
379
401
380
-
Sucesso! Ganho de 700x `r emo::ji("exploding_head")` para uma matriz de dimensão `r format(n, big.mark = ".", decimal.mark = ",")` x `r format(n, big.mark = ".", decimal.mark = ",")`!
402
+
```{r figmatmul, echo=FALSE, fig.cap='Benchmarks de Multiplicação de Matriz: R vs C++'}
403
+
ggplot2::autoplot(b1, "violin")
404
+
```
405
+
406
+
407
+
Sucesso! Ganho de 200x `r emo::ji("exploding_head")`
381
408
382
409
## Usando a biblioteca padrão C++11 STL no `{Rcpp}`
Aqui vemos como a vetorização do R funciona muito bem. É mais rápida que quase todas as implementações em `{Rcpp}`, exceto quando usamos o [`{Rcpp}` Sugar](http://dirk.eddelbuettel.com/code/rcpp/Rcpp-sugar.pdf) já que temos um ganho de 2x para um vetor com `r format(n, big.mark = ".", decimal.mark = ",")` elementos.
490
+
```{r figss, echo=FALSE, fig.cap='Benchmarks de Soma dos Quadrados: R vs alternativas C++'}
491
+
ggplot2::autoplot(b2, "violin")
492
+
```
493
+
494
+
495
+
Aqui vemos como a vetorização do R funciona muito bem. É mais rápida que quase todas as implementações em `{Rcpp}`, exceto quando usamos o [`{Rcpp}` Sugar](http://dirk.eddelbuettel.com/code/rcpp/Rcpp-sugar.pdf) já que temos um ganho de 2x.
459
496
460
497
## `{Rcpp}` e Boost
461
498
462
499
[Boost](https://www.boost.org) é um conjunto de bibliotecas para a linguagem de programação C++ que fornece suporte para tarefas e estruturas como álgebra linear, geração de números pseudo-aleatórios, multithreading, processamento de imagem, expressões regulares e teste de unidade. Ele contém ~~uma porrada~~ 164 bibliotecas individuais (versão 1.75) e sua versão inicial foi lançada em 1999.
463
500
464
-
A maioria das bibliotecas Boost são licenciadas sob a Licença de Software Boost, projetada para permitir que Boost seja usado com projetos de software proprietários e gratuitos. Muitos dos fundadores da Boost estão no comitê internacional de padrões C++, e várias bibliotecas Boost foram aceitas para incorporação no padrão C++11 (por exemplo, smart pointers, `thread`, `regex`, `random`, `ratio`, `tuple`) e no padrão C ++ 17 (por exemplo, `filesystem`, `any`, `optional`, `variant`, `string_view`).
501
+
A maioria das bibliotecas Boost são licenciadas sob a Licença de Software Boost, projetada para permitir que Boost seja usado com projetos de software proprietários e gratuitos. Muitos dos fundadores da Boost estão no comitê internacional de padrões C++, e várias bibliotecas Boost foram aceitas para incorporação no padrão C++11 (por exemplo, smart pointers, `thread`, `regex`, `random`, `ratio`, `tuple`) e no padrão C++17 (por exemplo, `filesystem`, `any`, `optional`, `variant`, `string_view`).
465
502
466
503
Antes de usar o Boost no `{Rcpp}` certifique-se que você tem o Boost instalado no seu sistema operacional:
467
504
@@ -516,15 +553,22 @@ int boostGCD(int& a, int& b) {
516
553
}
517
554
```
518
555
519
-
```{rbench_GCD}
556
+
```{rbench-GCD, message=FALSE}
520
557
a <- 7919
521
558
b <- 7412
522
-
bench::mark(
559
+
b3 <- bench::mark(
523
560
R = rGCD(a, b),
524
561
cpp = cppGCD(a, b),
525
-
boost = boostGCD(a, b)
562
+
boost = boostGCD(a, b),
563
+
relative = TRUE
526
564
)
565
+
b3
527
566
```
567
+
568
+
```{r figGCD, echo=FALSE, fig.cap='Benchmarks de Máximo Divisor Comum: R vs C++'}
569
+
ggplot2::autoplot(b3, "violin")
570
+
```
571
+
528
572
Aqui eu escolhi um número primo bem grande, 7189, e um número aleatório próximo dele, 7412. Como vocês podem ver a solução usando a biblioteca `boost::integer` é 4,5x mais rápida que uma implementação em R e similar com a implementação de C++17.
```{r figmatmul, echo=FALSE, fig.cap='Benchmarks de Multiplicação de Matriz: `Rcpp` vs `Armadillo` vs `Eigen`'}
464
+
ggplot2::autoplot(b1, "violin")
457
465
```
458
466
467
+
459
468
No meu computador `{RcppEigen}` é mais rápido que `{RcppArmadillo}`, mas ambos são mais lentos que uma implementação simples com `{Rcpp}`.
460
469
461
470
### Exemplo -- Matriz Esparsa
462
471
463
472
Vamos usar `mat_sparse` criada que possui dimensão `r format(dim(mat_sparse)[1], big.mark = ".", decimal.mark = ",")` x `r format(dim(mat_sparse)[2], big.mark = ".", decimal.mark = ",")` e tomar a raiz quadrada de todos os elementos.
```{r figfastlm, echo=FALSE, fig.cap='Benchmarks de Regressão Linear: R vs `Armadillo` vs `Eigen`'}
559
+
ggplot2::autoplot(b3, "violin")
540
560
```
541
561
542
562
Tanto `Eigen` quanto `Armadillo` são rápidos! Quase 100x mais rápidos `r emo::ji("exploding_head")`. Novamente a diferença entre `Eigen` e `Armadillo` é pequena.
0 commit comments