I wouldn't call it artificially building something, but I suppose yes. I also find this code to be much more readable than generator code. Once you understand the function, all you have to do is pass it a function that returns a boolean.
any(function_takes_time(i) for i in range(10 ** 3))
harder to read than fast_any([(lambda x: (lambda: function_takes_time(x)))(i) for i in range(10 ** 3)])