np.vectorize
для функций, которые не принимают ndarray в качестве аргумента, и это примерно цикл for, поэтому никогда не эффективен. например:
a=np.arange(1e4,dtype=float)
float.hex(a)
Traceback (most recent call last):
File "<ipython-input-27-e5cdcd882026>", line 1, in <module>
float.hex(a)
TypeError: descriptor 'hex' requires a 'float' object but received a 'numpy.ndarray'
np.vectorize
разрешает эту операцию:
%timeit np.vectorize(float.hex)(a)
14.6 ms ± 850 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
приблизительно эквивалентно (по результату и производительности):
%timeit [float.hex(z) for z in a]
14.2 ms ± 666 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Но здесь ваш iter
(переименован my_iter
) принимает ndarrays:
def my_iter(x): return x+np.random.uniform(-.5,.5)
%timeit my_iter(a)
16.1 µs ± 1.1 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
В этом случае гораздо лучше, чем:
%timeit np.vectorize(my_iter)(a)
28.6 ms ± 6.49 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)