производительность переменных POSIX с десятичными числами в R - PullRequest
1 голос
/ 13 сентября 2011

Я только что понял, что для переменной POSIX с двумя десятичными знаками следующая функция successor () показывает существенное снижение производительности.Кроме того, цикл for не может быть хорошим r-стилем *.Я был удивлен, что в моей системе POSIX с двумя десятичными знаками почти в 30 раз медленнее (20000 шагов), чем POSIX без десятичных дробей.POSIX с десятичными числами даже медленнее, чем просто хранить вектор как символ.

Так что же это медленная производительность только из-за функции successor ()?Или это вообще больше совет в R хранить переменные времени / даты в виде символов и просто преобразовывать их, когда это действительно необходимо?x [i], x1 = x [i + 1], y0 = y [i], y1 = y [i + 1]) на графике.Во всяком случае, я думаю, что должен быть другой способ обратиться к преемникам / предшественникам, так как хранение значений дважды кажется мне бесполезным.Но я не программист, просто пользователь.

Ответы [ 2 ]

5 голосов
/ 13 сентября 2011

Проблема в вашем цикле, а не в типе данных. В R всегда векторизуйте свои функции до того, как вы будете использовать циклы.

Вот альтернативная формулировка функции-преемника, выполнение которой практически не занимает времени. Он просто удаляет первый элемент вектора, а затем добавляет NA как последний элемент:

successor2 <- function(x){ c(x[-1], NA) }

Время и показ того, что результаты совпадают:

> system.time(XX <- successor2(as.numeric(v)))
   user  system elapsed 
      0       0       0 
> system.time(YY <- successor(v))
   user  system elapsed 
   5.98    0.00    7.97 
> all.equal(XX, YY)
[1] TRUE
3 голосов
/ 13 сентября 2011

В вашем примере u - это класс POSIXlt, а v - это класс POSIXct. Если вы конвертируете u в POSIXct, время будет очень похожим.

POSIXlt объекты менее эффективны, поскольку они хранятся в виде списка векторов, тогда как POSIXct объекты хранятся в виде одного числового вектора.

> u <- as.POSIXct(u)
> u.posix.time.small<-system.time(successor(u[1:1000]))
> u.char.time.small<-system.time(successor(as.character(u[1:1000])))
> u.posix.time.big<-system.time(successor(u[1:20000]))
> u.char.time.big<-system.time(successor(as.character(u[1:20000])))
> rbind(u.posix.time.small,u.posix.time.big,u.char.time.small, u.char.time.big,
+ v.posix.time.small, v.posix.time.big, v.char.time.small,v.char.time.big)[,1:3]
                   user.self sys.self elapsed
u.posix.time.small      0.04     0.00    0.04
u.posix.time.big        1.91     0.01    1.92
u.char.time.small       0.01     0.00    0.02
u.char.time.big         0.29     0.02    0.32
v.posix.time.small      0.05     0.00    0.04
v.posix.time.big        1.43     0.00    1.44
v.char.time.small       0.02     0.00    0.01
v.char.time.big         0.32     0.00    0.32
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...