25

タイトル通り。なぜ潤滑剤の機能がそれほど遅いのですか?

library(lubridate)
library(microbenchmark)

Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d-%m-%Y')), 50000, replace = TRUE)

microbenchmark(as.POSIXct(Dates, format = "%d-%b-%Y %H:%M:%S", tz = "GMT"), times = 100)
microbenchmark(dmy(Dates, tz ="GMT"), times = 100)

Unit: milliseconds
expr                                                            min         lq          median      uq          max
1 as.POSIXct(Dates, format = "%d-%b-%Y %H:%M:%S", tz = "GMT")   103.1902    104.3247    108.675     109.2632    149.871
2 dmy(Dates, tz = "GMT")                                        184.4871    194.1504    197.8422    214.3771    268.4911
4

2 に答える 2

46

同じ理由で、車はロケットの上に乗るのに比べて遅いです。追加された使いやすさと安全性により、車はロケットよりもはるかに遅くなりますが、爆破される可能性は低く、車の始動、操縦、ブレーキングが簡単になります。ただし、適切な状況(たとえば、月に着く必要がある場合)では、ロケットはその作業に適したツールです。今、誰かがロケットを屋根に固定した車を発明したとしたら、私たちは何かを持っているでしょう。

何が行われているのかを確認することから始めてください。速度の違いがわかります(ちなみに、ベンチマークからすると、ミリ秒単位の速度ほど遅いとはdmy言えません)。lubridate

dmy #これをコマンドラインに入力すると、次のようになります。

>dmy
function (..., quiet = FALSE, tz = "UTC") 
{
    dates <- unlist(list(...))
    parse_date(num_to_date(dates), make_format("dmy"), quiet = quiet, 
        tz = tz)
}
<environment: namespace:lubridate>

すぐに私は見parse_dateて、num_to_dateそしてmake_format。これらすべての人が何であるか不思議に思う。どれどれ:

parse_date

> parse_date
function (x, formats, quiet = FALSE, seps = find_separator(x), 
    tz = "UTC") 
{
    fmt <- guess_format(head(x, 100), formats, seps, quiet)
    parsed <- as.POSIXct(strptime(x, fmt, tz = tz))
    if (length(x) > 2 & !quiet) 
        message("Using date format ", fmt, ".")
    failed <- sum(is.na(parsed)) - sum(is.na(x))
    if (failed > 0) {
        message(failed, " failed to parse.")
    }
    parsed
}
<environment: namespace:lubridate>

num_to_date

> getAnywhere(num_to_date)
A single object matching ‘num_to_date’ was found
It was found in the following places
  namespace:lubridate
with value

function (x) 
{
    if (is.numeric(x)) {
        x <- as.character(x)
        x <- paste(ifelse(nchar(x)%%2 == 1, "0", ""), x, sep = "")
    }
    x
}
<environment: namespace:lubridate>

make_format

> getAnywhere(make_format)
A single object matching ‘make_format’ was found
It was found in the following places
  namespace:lubridate
with value

function (order) 
{
    order <- strsplit(order, "")[[1]]
    formats <- list(d = "%d", m = c("%m", "%b"), y = c("%y", 
        "%Y"))[order]
    grid <- expand.grid(formats, KEEP.OUT.ATTRS = FALSE, stringsAsFactors = FALSE)
    lapply(1:nrow(grid), function(i) unname(unlist(grid[i, ])))
}
<environment: namespace:lubridate>

うわー、、、、などに加えてstrsplit-ting、Whole Lotta Error Checking Going On(Zepの曲で再生)を取得しました。つまり、ここにあるのは、いくつかの優れたシンタックスシュガーです。うーん、おいしいですが、価格とスピードが付いています。expand-ing.grid-spaste-ingifelse-ingunname-ing

それを:と比較して as.POSIXctください

getAnywhere(as.POSIXct)  #tells us to use methods to see the business
methods('as.POSIXct')    #tells us all the business
as.POSIXct.date          #what I believe your code is using (I don't use dates though)

内部コーディングがはるかに多く、エラーチェックが少なくなってas.POSIXct いるので、使いやすさと安全性、または速度とパワーのどちらが必要かを尋ねる必要があります。仕事によって異なります。

于 2012-05-18T13:43:34.640 に答える
12

@タイラーの答えは正しいです。ヘルプファイルから、潤滑剤をより速くするためのヒントを含むいくつかの詳細情報があります:

「Lubridateには、Simon Urbanekによってfasttimeパッケージから移植された非常に高速なPOSIXパーサーが組み込まれています。この機能はまだオプションであり、options(lubridate.fasttime = TRUE)でアクティブ化できます。LubridateはPOSIX文字列を自動的に検出し、代わりに高速パーサーを使用します。デフォルトのstrptimeユーティリティの。」

于 2014-04-19T17:07:41.507 に答える