>>  <<  Ркв  Ввд  JfC  LJ  Фрз  Слв  Изм  Рзг  !:  Помощь  Словарь

Приложение B. Специализированный Код

Многие примитивы содержат специализированный код для некоторых видов их аргументов, позволяющий достичь большей эффективности (по времени выполнения или обьему необходимой для этого памяти), недоступной в общем случае. Более того, некоторые “узнаваемые” фразы тоже реализованы специализированным кодом. Например, диадный случай крючка ($,) точно соответствует оператору reshape в APL (обозначаемому там ρ); его специализированная реализация избегает разборки правого аргумента, экономя, таким образом, процессорное время и память:

   ts=: 6!:2 , 7!:2@]
   x=: 11 13 17 19 23
   y=: 29 7 23 11 19$'sesquipedalian'

   (x ($,) y) -: x $, y
1

   ts 'x ($,) y'
0.00773981 2.09818e6
   ts 'x $, y'
0.0170125 3.14662e6
Реализованные специализированным кодом распознаваемые случаи перечислены ниже:
                        
= диада на булевских аргументах операция выполняется пословно (параллельно в рамках процессорного слова), как и для следующих глаголов:
= < <. <: > >. >: +. +: * *. *: ^ ~: | !
<.@f оба как и >.@f избегает нецелых промежуточных результатов на целых произв. точности
<.@% диада так же <.@:% >.@% >.@:% ; спец. код для целых аргументов см. информацию об изменениях в J 6.02
i.<./ монада так же i.>./ and i:<./ and i:>./ ; спец. код для целых и действительных списков; см. информацию об изменениях в J 5.04
i.>./ монада так же i.<./ , i:<./ и i:>./ ; спец. код для целых и действительных списков (см. информацию об изменениях в J 5.04)
+ диада так же * и - ; под Windows, реализована на ассемблере для целых аргументов и операций вектор-вектор, вектор-скаляр, и скаляр-вектор
^ диада x^y вычисляется повторным умножением для действительных x и целых y
m&|@^ диада избегает возведения в степень для целых аргументов
m&|@(n&^) монада избегает возведения в степень для целых аргументов
{&x^:a: монадаd спец. код для целых списков x ; см. информацию об изменениях в J 5.04
{~^:a: диада спец. код; см информацию об изменениях в J 5.04
f@]^:g диада применяет f вместо x&(f@]) на каждой итерации; см. информацию об изменениях в J 6.01
| диада спец. код, когда левый аргумент -- положительная степень двойки; см. информацию об изменениях в J 6.02
+/ .* диада так же +./ .* и ~:/ .*. ; спец. код в общем случае; спец. код для булевского левого или правого аргумента и векторного правого аргумента; см. информацию об изменениях в J 5.04 и информацию об изменениях в J 6.01
-/ .* монада спец. код в общем случае; спец. код для квадратных матриц; спец. код для массивов матриц 2 на 2; см информацию об изменениях в J 4.05
$, диада так же ($,)"r ; так же {, {., }., e., ; избегает разборки; см. информацию об изменениях в J 4.06
x=.x,y - так же =: ; на месте (без перемещения данных в памяти); см. информацию об изменениях в J 5.03
;@:(<@u;.n) диада спец. код; см. информацию об изменениях в J 5.03
;@:{ диада спец. код; см. информацию об изменениях в J 5.03
[;.0 оба так же ] ; спец. код для векторных и матричных правых аргументов; см. информацию об изменениях в J 5.01
f;.1 оба так же f;._1 f;.2 f;._2 ; избегает построения ячеек аргумента для некоторых глаголов: < $ , # [ ] {. {: <@}. <@}: ; так же <&}. <@:}. и т.д.; см. информацию об изменениях в J 4.05
f;.1 оба так же f;._1 f;.2 f;._2 ; спец. код для прореженных булевских левых аргументов; см. информацию об изменениях в J 4.06
f;.1 оба так же f;._1 f;.2 f;._2 ; спец. код, когда результат f в каждом разрезе — упаковка или атом; см. информацию об изменениях в J 5.03
f/;.1 оба так же f;._1 f;.2 f;._2 ; спец. код для ато́мных глаголов = < + +. * и т.д.; см. информацию об изменениях в J 5.03
f;.3 оба так же f;._3 ; спец. код для матричных аргументов
;@:(<@u;.n) диада спец. код; см. информацию об изменениях в J 5.03
# диада спец. код для булевских левых аргументов
#: диада спец. код для (0,d)#:y , где d является положительной степенью двойки и y целое; см. информацию об изменениях в J 6.02
#: i.@(*/) монада так же (#: i.&(*/)) , и т.д.; спец. код для неотрицательных целых векторов; см. информацию об изменениях в J 4.05
x&(128!:3) монада спец. код, пред-вычисляющий таблицу значений CRC для каждого байта
=/"r монада так же < <: > >: +. +: * *. *: ~: ; работает пословно для булевских аргументов; так же спец. код для вставок вдоль измерений длины 2 см. информацию об изменениях в J 5.03
+/ монада так же * и - ; под Windows реализовано на ассемблере для целых аргументов
,/ монада так же ,. ; ,&.> ,.&.> ; линейное время; см. информацию об изменениях в J 4.05 и информацию об изменениях в J 7.01
m b./ оба спец. код для побитных булевских функций; см. информацию об изменениях в J 5.01
f/@, монада так же f/@:, f/&, f/&:, ; избегает разборки; см. информацию об изменениях в J 4.05
f/@:g диада также [: f/ g ; специализированный код для ато́мных f и g ; дополнительная оптимизация для +/@:g ; см. информацию об изменениях в J 6.01
#/. диада избегает построения ячеек аргумента; см. информацию об изменениях в J 5.03и информацию об изменениях в J 6.02
+//. монада так же +. *. = ~: <. <: >. >: 17 b. 22 b. 23 b. ; избегает построения ячеек аргумента; см. информацию об изменениях в J 6.01
+//. диада так же +. *. <. >. = ~:  n b. для различных векторных правых аргументов; избегает построение ячеек аргумента; см. информацию об изменениях в J 5.03
</. i.@# монада так же x</.i.#x ; спец. код; см. информацию об изменениях в J 5.03
({.,#)/. диада так же (#,{.)/. ; спец. код; см. информацию об изменениях в J 5.04
(+/%#)/. диада избегает построения ячеек аргумента; см. информацию об изменениях в J 6.02
+//.@(*/) диада так же ~://.@(*./) ~://.@(+./) +//.@(*./) +//.@(+./) (22 b.)//.@(17 b./) ; избегает построения ячеек аргумента; см. информацию об изменениях в J 6.01
/: оба так же \: ; спец. код для нескольких типов данных; спец. код для аргументов с 5-ю или менее элементами; см. информацию об изменениях в J 4.05
/: диада спец. код для случая, когда левый и правый аргументы — идентичные булевские, текстовые, целые или действительные вектора; так же для /:"1 , когда левый и правый аргументы — идентичные булевские, текстовые, целые или действительные массивы; то же для \: ; см. информацию об изменениях в J 5.01
/:~ монада спец. код для булевских, текстовых, целых и действительных векторов; так же для /:~"1 и /:"1~ ; то же для \: ; см. информацию об изменениях в J 5.01
/:@/: монада так же /:@:/: и /:&/: и т.д.; спец. код; см. информацию об изменениях в J 5.04
{/: диада так же {/:~ ; спец. код для скалярных целых левых аргументов и целых или действительных векторных правых аргументов; см.информацию об изменениях в J 6.03
#\ монада спец. код; см. информацию об изменениях в J 7.01
=/\ монада так же +. *. ~: ; работает пословно для булевских аргументов
+/\ монада так же * и - ; под Windows, реализовано на ассемблере для целых аргументов
+/\ диада так же <. >. +. *. = ~:  m b. для ато́мных m e. 17 22 23 25 ; спец. код для положительных левых аргументов и булевских, целых или действительных правых аргументов; см. информацию об изменениях в J 5.03 и J 6.02
[\ диада так же ] и , ; см. информацию об изменениях в J 5.01
2 f/\y диада спец. код; см. информацию об изменениях в J 4.06 и J 6.01
m b./\ монада спец. код для побитных булевских функций; см. информацию об изменениях в J 5.01
(+/%#)\ диада спец. код для положительных левых аргументов с целыми и действительными правыми аргументами; см. информацию об изменениях в J 5.03
#\. монада спец. код; см. информацию об изменениях в J 7.01
u/\. монада спец. код
=/\. монада так-же < <: > >: +. +: *. *: ~: ; работает пословно для булевских аргументов
+/\. монада так же * и - ; под Windows, реализовано на ассемблере для целых аргументов
m b./\. монада спец. код для побитовых булевских функций; см. информацию об изменениях в J 5.01
f/\. диада спец. код для поатомно ассоциативных глаголов f ; см. информацию об изменениях в J 6.02
{ диада спец. код для правых аргументов некоторых типов данных; спец. код для целых левых аргументов; спец. код для индексирования первых двух измерений
<"1@[ { ] диада избегает <"1 если левый аргумент — массив целых
p{~q i.] монада так же (q i.]) { p"_  и  q&i.{p"_ ; спец. код, когда p и q текстовые списки; см. информацию об изменениях в J 6.02
{/: диада так же {/:~ ; спец. код для скалярных целых левых аргументов и целых или действительных векторных правых аргументов; см. информацию об изменениях в J 6.03
a=: c}x,y,:z - избегает присоединения и наклеивания; на месте, если c имеет булевский тип, и a есть x или y ; см. информацию об изменениях в J 4.05
y=: x i}y - на месте
y=: y i}~ x - не выделяет памяти; см. информацию об изменениях в J 6.03
f"r оба многие глаголы имеют встроенную поддержку ранга
монады и диады <. <: < >. >: + +. +: * *. *: - -: % ^ ~: | |. |: , ,: ! /: \: [ ] {. }. o.
только монады   -. %: ^. #. ,. / \ \. {: }: @. ? A. H. j. p. p: q: r. t. x:  /:@/:
только диады   = > $ # { e. i. i:  ($,)  m b.  -.@-:
Для (+/%#)"r см. информацию об изменениях в J 6.02.
^@o. монада спец. код; см. информацию об изменениях в J 7.01
"."0@": монада так же @: или & или &: вместо @ ; специализированный код; см. информацию об изменениях в J 6.01
f0`...`fn@.v"0 монада спец. код, если f0 , ... , fn ато́мные; см. информацию об изменениях в J 5.02
x&(128!:3) монада спец. код, предвычисляющий таблицу значения CRC для каждого байта
m&i. монада так же m&i: -.&m  e.&m ; см. информацию об изменениях в J 5.04
u&.(a.&i.) монада спец. код если u-:u"0 ; см. информацию об изменениях в J 6.02
m b./&.(a.&i.) монада избегает преобразования из/в целые; см. информацию об изменениях в J 6.02
m b.&.(a.&i.) диада избегает преобразования из/в целые; см. информацию об изменениях в J 6.02
? монада так же ?. ; спец код, если аргумент равен 2
?@$ диада так же ?. ; так же ?@# ; так же [: ? $ ; спец. код; см. информацию об изменениях в J 5.03
e.i.0: диада см. строку для f i.0: ниже
E. монада спец. код для булевских и текстовых векторов
E.i.1: диада см. строку для f i.0: ниже
i. монада так же i: ; спец. код для аргументов длины 1
i. диада так же e. и i: ; спец. код для нескольких типов данных; спец. код для i.!.0 ; спец. код для монады i.~ или x i. x ; спец. код для аргументов с большим числом одинаковых столбцов; см. информацию об изменениях в J 4.05
f i.0: диада спец. код для следующих функций; см. информацию об изменениях в J 5.01, J 5.03, и J 5.04.
f i. 0:    i.&0@:f    первая позиция, где не x f y
f i. 1:  i.&1@:f  первая позиция, где x f y
f i: 0:  i:&0@:f  последняя позиция, где не x f y
f i: 1:  i:&1@:f  последняя позиция, где x f y
[: + / f  + /@:f  количество позиций, где x f y
[: +./ f  +./@:f  x f y где либо ?
[: *./ f  *./@:f  x f y везде?
[: I.  f  I. @:f  позиции, где x f y
Примечания:
   f один из глаголов = ~: < <: > >: E. e.
   Спец. код используется только для булевских, целых, действительных, текстовых и символьных аргументов
   Спец. код используется только для атомов и списков, если f не e.
   Если f есть E. , то спец. код только для   E.i.1:  +/@:E.  +./@:E.  I.@:E.
i.<./ монада так же i.>./ , i:<./ и i:>./ ; спец. код для целых и действительных списков; см. информацию об изменениях в J 5.04
m&i. монада так же m&i: -.&m  e.&m ; см. информацию об изменениях в J 5.04
p {~ q i. ] монада так же (q i. ]) { p"_ и q&i. { p"_ ; спец. код, когда p и q текстовые списки; см. информацию об изменениях в J 6.02
I.@:< диада см строку для f i.0: выше
+/%# монада спец. код для следующих случаев:
(+/%#)/. J 6.02
(+/%#)\  J 5.03
(+/%#)"r J 6.02



>>  <<  Ркв  Ввд  JfC  LJ  Фрз  Слв  Изм  Рзг  !:  Помощь  Словарь