Я много читал: "избегайте циклов с numpy". Итак, я попробовал. Я использовал этот код (упрощенная версия). Некоторые вспомогательные данные:
In[1]: import numpy as np
resolution = 1000 # this parameter varies
tim = np.linspace(-np.pi, np.pi, resolution)
prec = np.arange(1, resolution + 1)
prec = 2 * prec - 1
values = np.zeros_like(tim)
Моя первая реализация была с циклом for
:
In[2]: for i, ti in enumerate(tim):
values[i] = np.sum(np.sin(prec * ti))
Затем я избавился от явного цикла for
и достиг этого:
In[3]: values = np.sum(np.sin(tim[:, np.newaxis] * prec), axis=1)
И это решение было быстрее для небольших массивов, но когда я увеличился, у меня появилась такая временная зависимость:
Что мне не хватает или это нормальное поведение? И если это не так, где копать?
РЕДАКТИРОВАТЬ. Согласно комментариям, здесь приведена дополнительная информация. Время измерялось с помощью IPython %timeit
и %%timeit
, каждый запуск выполнялся на новом ядре. Мой ноутбук - acer aspire v7-482pg (i7, 8GB). Я использую:
- python 3.5.2
- numpy 1.11.2 + mkl
- Windows 10