Is any() evaluated lazily?
<p>I am writing a script in which i have to test numbers against a number of conditions. If <strong>any</strong> of the conditions are met i want to return <code>True</code> and i want to do that the fastest way possible.</p>

<p>My first idea was to use <code>any()</code> instead of nested <code>if</code> statements or multiple <code>or</code> linking my conditions. Since i would be satisfied if any of the conditions were <code>True</code> i could really benefit from <code>any()</code> being lazy and returning True as soon as it could.</p>

<p>Based on the fact that the following print happens instantly and not after 10 (= 0 + 1 + 2 + 3 + 4) seconds i assume it is. Is that the case or am i somehow mistaken?</p>

<pre><code>import time

def some(sec):
    time.sleep(sec)
    return True

print(any(some(x) for x in range(5)))
</code></pre>

<p>While the <a href="https://docs.python.org/2.7/library/functions.html#all" rel="nofollow"><code>all()</code></a> and <a href="https://docs.python.org/2.7/library/functions.html#any" rel="nofollow"><code>any()</code></a> functions short-circuit on the first "true" element of an iterable, the iterable itself may be constructed in a non-lazy way. Consider this example:</p>

<pre><code>&gt;&gt; any(x == 100 for x in range(10**8))
True
</code></pre>

<p>This will take several seconds to execute in Python 2 as <code>range(10**8)</code> constructs a list of 10**8 elements. The same expression runs instantly in Python 3, where <code>range()</code> is lazy.</p>

python