R:Оптимизация/Предварительное выделение памяти — различия между версиями
м (→Предварительное выделение памяти) |
м (→Предварительное выделение памяти) |
||
Строка 27: | Строка 27: | ||
noaaloc(10^4) 41.746 42.719 43.353 44.603 76.31 100 | noaaloc(10^4) 41.746 42.719 43.353 44.603 76.31 100 | ||
alloc(10^4) 5.524 5.896 6.019 6.777 27.35 100</nowiki>}} | alloc(10^4) 5.524 5.896 6.019 6.777 27.35 100</nowiki>}} | ||
+ | |||
+ | === Создание объектов в R === | ||
+ | |||
+ | ==== Векторы ==== | ||
+ | |||
+ | {| class="prettytable wide" | ||
+ | |- | ||
+ | | <code>integer(n)</code> || создаёт объект типа <code>integer</code> ([http://ru.wikipedia.org/wiki/Число_с_фиксированной_запятой число с фиксированной запятой]) длинной <code>n</code>. | ||
+ | |- | ||
+ | | <code>numeric(n)</code> || создаёт объект типа <code>double</code> ([http://ru.wikipedia.org/wiki/Числа_с_плавающей_запятой число с плавающей запятой]) длинной <code>n</code><ref>Эквивалент функции <code>double()</code></ref>. | ||
+ | |- | ||
+ | | <code>double(n)</code> || создаёт объект типа <code>double</code> ([http://ru.wikipedia.org/wiki/Числа_с_плавающей_запятой число с плавающей запятой]) длинной <code>n</code> ([http://ru.wikipedia.org/wiki/Число_двойной_точности число двойной точности]). | ||
+ | |- | ||
+ | | <code>single(n)</code> || создаёт объект типа <code>double</code> ([http://ru.wikipedia.org/wiki/Числа_с_плавающей_запятой число с плавающей запятой]) длинной <code>n</code> ([http://ru.wikipedia.org/wiki/Число_одинарной_точности число одинарной точности]). | ||
+ | |- | ||
+ | | <code>complex(n)</code> || создаёт объект типа <code>complex</code> ([http://ru.wikipedia.org/wiki/Комплексный_тип_данных комплексный тип данных]) длинной <code>n</code>. | ||
+ | |- | ||
+ | | <code>character(n)</code> || создаёт объект типа <code>character</code> ([http://ru.wikipedia.org/wiki/Строковый_тип строковый тип данных]) длинной <code>n</code>. | ||
+ | |- | ||
+ | | <code>logical(n)</code> || создаёт объект типа <code>logical</code> ([http://ru.wikipedia.org/wiki/Логический_тип логический тип данных]) длинной <code>n</code>. | ||
+ | |} | ||
+ | |||
+ | Создание любого типа вектора можно также осуществить с помощью функции <code>vector()</code>. Данная функция принимает два аргумента: <code>mode</code>, указывающая тип данных и <code>length</code>, указывающая длину вектора. Например, создание вектора целых чисел, длиной 100 можно создать с помощью следующих команд: | ||
+ | |||
+ | {{r-code|code=<nowiki>> x <- integer(100) | ||
+ | > x <- vector("integer", 100)</nowiki>}} | ||
+ | |||
+ | == Примечания == | ||
+ | |||
+ | <references /> | ||
[[Категория:R]] | [[Категория:R]] | ||
[[Категория:Оптимизация кода]] | [[Категория:Оптимизация кода]] |
Версия 17:26, 13 апреля 2014
|
Материал «R:Оптимизация/Предварительное выделение памяти», созданный автором Артём Клевцов, публикуется на условиях лицензии Creative Commons «Attribution» («Атрибуция») 4.0 Всемирная. | |
|
Перед использованием функций из пакетов их необходимо предварительно установить и загрузить: КодR <syntaxhighlight lang="r">> install.packages(pkgs = "pkgname") > library(package = "pkgname")</syntaxhighlight> |
Предварительное выделение памяти
Частой задачей, решаемой с помощью циклов, является выполнение расчётов и занесение результатов в переменную. Таким образом, результирующая переменная будет заполняться данными по мере работы цикла. Предварительное выделение памяти (preallocate) позволяет ускорить работу циклов, работающих с постепенной заполняемыми данными. Суть данного метода заключается в том, чтобы заранее выделить место в оперативной памяти, в которую будут записываться данные во время работы цикла. Выделение памяти осуществляется путём указания типа и размера переменной. Если этого не сделать, то при каждой новой итерации необходимо выделять новое место в памяти и производить туда запись.
Обратите внимание, что переменные, участвующие в цикле, должны быть объявлены до того, как будут использоваться.
<syntaxhighlight lang="r">> noaaloc <- function(n) { + x <- NULL # объявляем пустую переменную + for (i in seq_len(n)) + x[i] <- i * i + x + } > > alloc <- function(n) { + x <- integer(n) # объявляем переменную нужного типа и размера + for (i in seq_len(n)) + x[i] <- i * i + x + } > microbenchmark(noaaloc(10^4), alloc(10^4)) Unit: milliseconds expr min lq median uq max neval noaaloc(10^4) 41.746 42.719 43.353 44.603 76.31 100 alloc(10^4) 5.524 5.896 6.019 6.777 27.35 100</syntaxhighlight>
Создание объектов в R
Векторы
integer(n) |
создаёт объект типа integer (число с фиксированной запятой) длинной n .
|
numeric(n) |
создаёт объект типа double (число с плавающей запятой) длинной n [1].
|
double(n) |
создаёт объект типа double (число с плавающей запятой) длинной n (число двойной точности).
|
single(n) |
создаёт объект типа double (число с плавающей запятой) длинной n (число одинарной точности).
|
complex(n) |
создаёт объект типа complex (комплексный тип данных) длинной n .
|
character(n) |
создаёт объект типа character (строковый тип данных) длинной n .
|
logical(n) |
создаёт объект типа logical (логический тип данных) длинной n .
|
Создание любого типа вектора можно также осуществить с помощью функции vector()
. Данная функция принимает два аргумента: mode
, указывающая тип данных и length
, указывающая длину вектора. Например, создание вектора целых чисел, длиной 100 можно создать с помощью следующих команд:
<syntaxhighlight lang="r">> x <- integer(100) > x <- vector("integer", 100)</syntaxhighlight>
Примечания
- ↑ Эквивалент функции
double()