any() is short-circuiting if the length of array is more than 16. That seems like dubious semantics to me.
Ivar fredag 30. januar 2015 09.39.28 UTC+1 skrev Mike Innes følgende: > > Ok, I now see that `all` isn't short-circuiting, which is kind of > surprising/annoying. Anyone know why that is? > > You can easily define your own short-circuiting `all` to do this: > > all′(f, xs) = > isempty(xs) ? true : > f(xs[1]) && all′(f, xs[2:end]) > > The other thing you could try is to check out Lazy.jl. If you call, for > example, > > @time all(map(f,list(1,2,3,5))) > > The `list` construct actually takes care of short-circuiting for you, so > what looks like a very expensive `map` operation is actually very cheap. > > On 30 January 2015 at 08:05, Mike Innes <[email protected] <javascript:> > > wrote: > >> How about `all(f, values)`? >> >> On 30 January 2015 at 06:51, Wai Yip Tung <[email protected] >> <javascript:>> wrote: >> >>> I want to apply function f() over a range of value. f() returns true for >>> success and false for failure. Since f() is expensive, I want short circuit >>> computation, i.e. it stops after the first failure. >>> >>> In python, I can do this in an elegant way with the all() function and >>> generator expression. >>> >>> if all(f(x) for x in values) >>> # success >>> else >>> # failure >>> >>> From what I understand, there is no generator expression in Julia. List >>> comprehension will evaluate the full list. Even if I try to use for loop, I >>> can't use the control variable to check if the loop has run to finish or >>> not. >>> >>> i = 0 >>> for i in 1:length(values) >>> if !f(values[i]) >>> break >>> end >>> end >>> # The status is ambiguous if i==length(values) >>> >>> My last resort is to add flags to indicate if is success or not. Is >>> there some more elegant way to do this? >>> >>> >> >
