регулярные выражения в базе R: «perl=TRUE» против значения по умолчанию(PCRE против TRE)




regex (2)

Запустив тесты @ wiktor-stribiżew, я получаю от него другой результат. При первом тесте механизм PCRE работает быстрее, чем TRE (т.е. perl=TRUE быстрее). Со вторым тестом нет существенной разницы в производительности между PCRE или TRE.

Они работали на R версии 3.4.2 (2017-09-28), macOS Sierra 10.12.6, i7-2675QM CPU @ 2,20 ГГц

```
txt <- "Butterflies are insects in the macrolepidopteran clade Rhopalocera from the order Lepidoptera, which also includes moths. Adult butterflies have large, often brightly coloured wings, and conspicuous, fluttering flight. The group comprises the large superfamily Papilionoidea, which contains at least one former group, the skippers (formerly the superfamily \"Hesperioidea\") and the most recent analyses suggest it also contains the moth-butterflies (formerly the superfamily \"Hedyloidea\"). Butterfly fossils date to the Paleocene, which was about 56 million years ago."

library(microbenchmark)

PCRE_1 <- function(text) sub('.*\\((.*)\\).*', '\\1', txt, perl=TRUE)
TRE_1  <- function(text) sub('.*\\((.*)\\).*', '\\1', txt)
(test <- microbenchmark( PCRE_1(txt), TRE_1(txt), times = 500000 ))
#> Unit: microseconds
#>         expr    min     lq     mean median     uq       max neval
#>  PCRE_1(txt) 31.693 32.857 37.00757 33.413 35.805 43810.177 5e+05
#>   TRE_1(txt) 46.037 47.199 53.06407 47.807 51.981  7702.869 5e+05

PCRE_2 <- function(text) regmatches(txt, gregexpr("\"[A-Za-z]+\"", txt, perl=TRUE))
TRE_2  <- function(text) regmatches(txt, gregexpr("\"[A-Za-z]+\"", txt))
(test <- microbenchmark( PCRE_2(txt), TRE_2(txt), times = 500000 ))
#> Unit: microseconds
#>         expr    min     lq     mean median     uq      max neval
#>  PCRE_2(txt) 63.801 68.115 75.51773 69.164 71.219 47686.40 5e+05
#>   TRE_2(txt) 63.825 67.849 75.20246 68.883 70.933 49691.92 5e+05
```

При использовании базовых строковых функций R, таких как gsub и grep , есть ли какой-либо недостаток, чтобы, по привычке, всегда указывать perl = TRUE ? Есть ли минусы в этом?

С perl=TRUE выражения могут делать больше вещей (например, вы можете использовать просмотр вперед или просмотр утверждений или преобразование регистра с помощью \\U ), и производительность также выше, как указано в документации.

Итак, есть ли минусы? Разве perl = TRUE не используется по умолчанию только для обратной совместимости? Есть ли проблемы с переносимостью, о которых я должен знать, когда perl = TRUE?


Мои результаты Ubuntu 16.04, - Perl быстрее, смотрите ниже.

Unit: microseconds
        expr    min     lq  mean median    uq    max neval cld
 PCRE_1(txt)  8.949  9.809 11.16  10.18 10.62 135299 5e+05  a 
  TRE_1(txt) 23.816 24.805 26.84  25.23 26.17   5433 5e+05  b

Unit: microseconds
        expr   min    lq  mean median    uq    max neval cld
 PCRE_2(txt) 26.97 30.96 37.32  32.19 35.06 243164 5e+05  a 
  TRE_2(txt) 33.75 38.07 44.50  39.40 43.33  35632 5e+05   b


Session info -----------------------------------------------------------------
 setting  value                       
 version  R version 3.4.2 (2017-09-28)
 system   x86_64, linux-gnu           
 ui       RStudio (1.1.383)           
 language en                          
 collate  en_US.UTF-8                 
 tz       Europe/Berlin               
 date     2017-11-12     



    Linux  4.4.0-93-generic #116-Ubuntu SMP Fri Aug 11 21:17:51 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

model name  : Intel(R) Core(TM) i7-4770K CPU @ 3.50GHz
stepping    : 3
microcode   : 0x9
cpu MHz     : 3647.929
cache size  : 8192 KB






regex