R:Оптимизация/Предварительное выделение памяти — различия между версиями

Материал Psylab.info - энциклопедии психодиагностики
Перейти к: навигация, поиск
м (Предварительное выделение памяти)
м (Предварительное выделение памяти)
Строка 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


Предварительное выделение памяти

Частой задачей, решаемой с помощью циклов, является выполнение расчётов и занесение результатов в переменную. Таким образом, результирующая переменная будет заполняться данными по мере работы цикла. Предварительное выделение памяти (preallocate) позволяет ускорить работу циклов, работающих с постепенной заполняемыми данными. Суть данного метода заключается в том, чтобы заранее выделить место в оперативной памяти, в которую будут записываться данные во время работы цикла. Выделение памяти осуществляется путём указания типа и размера переменной. Если этого не сделать, то при каждой новой итерации необходимо выделять новое место в памяти и производить туда запись.

Обратите внимание, что переменные, участвующие в цикле, должны быть объявлены до того, как будут использоваться.

КодR

<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 можно создать с помощью следующих команд:

КодR

<syntaxhighlight lang="r">> x <- integer(100) > x <- vector("integer", 100)</syntaxhighlight>

Примечания

  1. Эквивалент функции double()