|
e.i.1: Improved |
initial writing: 2004-08-18 last updated: 2005-04-21 |
The dyad e.i.1: (and others, see below) are now supported
by special code. These are similar to the dyads previously described in
J5.02 and J5.03.
A complete table of such dyads are as follows:
| f i. 0: | i.&0@:f | first place where not x f y | ||
| f i. 1: | i.&1@:f | first place where x f y | ||
| f i: 0: | i:&0@:f | last place where not x f y | ||
| f i: 1: | i:&1@:f | last place where x f y | ||
| [: + / f | + /@:f | number of places where x f y | ||
| [: +./ f | +./@:f | x f y anywhere? | ||
| [: *./ f | *./@:f | x f y everywhere? | ||
| [: I. f | I. @:f | indices where x f y |
| Notes: | |||
| • | f is one of the verbs = ~: < <: > >: E. e. | ||
| • | Special code is available only for Boolean, integer, floating point, literal, and symbol arguments |
||
| • | Special code is used only for atoms and lists if f is not e. | ||
| • | If f is E. , special code only for E.i.1: +/@:E. +./@:E. I.@:E. |
||
Moreover, if f is e. and the right argument is fixed,
that is, (e.i.0:)&m , then that also is supported by special code.
(See details here.)
The following benchmarks demonstrate the improvement:
x=: 1e6 ?.@$ 1e6
y=: 1e3 ?.@$ 1e4
a=: 'abcdefghijklmnopqrstuvwxyz'
c=: a {~ 1e5 4 ?.@$ #a
d=: a {~ 1e4 4 ?.@$ #a
ts=: 6!:2 , 7!:2@]
ts 'Expression'
| Expression | J 5.04 | J 5.03 | Ratio | |||||||||
| x(e.i.1:)y | 0.0000119 | 17664 | 0.0309512 | 5244160 | 2600.01 | 296.88 | ||||||
| x(e.i:1:)y | 0.0000123 | 17664 | 0.0308734 | 5244160 | 2509.46 | 296.88 | ||||||
| x +/@:e. y | 0.0027426 | 17792 | 0.0248151 | 2098496 | 9.05 | 117.95 | ||||||
| x I.@e. y | 0.0031021 | 4211648 | 0.0265907 | 2098112 | 8.57 | 0.50 | ||||||
| c(e.i.1:)d | 0.0002968 | 132352 | 0.0045880 | 656640 | 15.46 | 4.96 | ||||||
| c(e.i:1:)d | 0.0002963 | 132352 | 0.0046068 | 656640 | 15.55 | 4.96 | ||||||
| c +/@:e. d | 0.0032609 | 132480 | 0.0039788 | 263488 | 1.22 | 1.99 | ||||||
| c I.@e. d | 0.0033605 | 656320 | 0.0041747 | 263104 | 1.24 | 0.40 | ||||||