NumPy ничего не может сделать, чтобы ускорить процесс повторного вызова функции, не предназначенной для взаимодействия с NumPy.
"Необычный способ использования numpy" - способ оптимизировать это - вручную переписать вашу функцию generate
, чтобы использовать операции NumPy для генерации целых массивов вывода вместо поддержки только отдельных значений. Вот как работает NumPy и как NumPy должен работать ; любое решение, которое включает в себя повторный вызов функции Python для каждой ячейки массива, будет ограничено накладными расходами Python. NumPy может только ускорить работу, которая фактически происходит в NumPy.
Если предоставляемые операции NumPy слишком ограничены для их перезаписи generate
, существуют такие опции, как перезапись generate
с помощью Cython или использование @numba.jit
для него. Они в основном помогают в вычислениях, которые включают сложные зависимости от одной итерации цикла к другой; они не помогают с внешними зависимостями, которые вы не можете переписать.
Если вы не можете переписать generate
, все, что вы можете сделать, это попытаться оптимизировать процесс получения возвращаемых значений в ваш массив. В зависимости от размера массива вы можете сэкономить время, повторно используя один объект массива:
In [32]: %timeit x = numpy.array([random.random() for _ in range(10)])
The slowest run took 5.13 times longer than the fastest. This could mean that an
intermediate result is being cached.
100000 loops, best of 5: 5.44 µs per loop
In [33]: %%timeit x = numpy.empty(10)
....: for i in range(10):
....: x[i] = random.random()
....:
The slowest run took 4.26 times longer than the fastest. This could mean that an
intermediate result is being cached.
100000 loops, best of 5: 2.88 µs per loop
но преимущество для больших массивов исчезает:
In [34]: %timeit x = numpy.array([random.random() for _ in range(100)])
10000 loops, best of 5: 21.9 µs per loop
In [35]: %%timeit x = numpy.empty(100)
....: for i in range(100):
....: x[i] = random.random()
....:
10000 loops, best of 5: 22.8 µs per loop