Я сравниваю производительность numpy и matlab , в нескольких случаях я заметил, что numpy значительно медленнее (индексация, простые операции над массивами, такие как абсолютное значение, умножение, сумма и т. Д.).Давайте рассмотрим следующий поразительный пример, включающий функцию digitize (которую я планирую использовать для синхронизации меток времени):
import numpy as np
import time
scale=np.arange(1,1e+6+1)
y=np.arange(1,1e+6+1,10)
t1=time.time()
ind=np.digitize(scale,y)
t2=time.time()
print 'Time passed is %2.2f seconds' %(t2-t1)
Результат:
Прошедшее время составляет 55,91 секунды
Теперь давайте попробуем тот же пример Matlab , используя эквивалентную функцию histc
scale=[1:1e+6];
y=[1:10:1e+6];
tic
[N,bin]=histc(scale,y);
t=toc;
display(['Time passed is ',num2str(t), ' seconds'])
Результат:
Прошедшее время составляет 0,10237 секунд
Это 560 раз быстрее!
Как яобучаясь расширять Python с помощью C ++, я реализовал свою собственную версию оцифровки (используя для этого расширенные библиотеки):
import analysis # my C++ module implementing digitize
t1=time.time()
ind2=analysis.digitize(scale,y)
t2=time.time()
print 'Time passed is %2.2f seconds' %(t2-t1)
np.all(ind==ind2) #ok
Результат:
Прошедшее время составляет 0,02 секунды.
Существует немного обмана, так как моя версия оцифровки предполагает, что все входы монотонны, это может объяснить, почему это даже быстрее, чем Matlab.Однако сортировка массива размером 1e + 6 занимает 0,16 секунды (с помощью numpy.sort), поэтому производительность моей функции хуже (примерно в 1,6 раза) по сравнению с функцией Matlab histc .
Итак, вопросы:
- Почему numpy.digitize такой медленный?Разве эта функция не должна быть написана в скомпилированном и оптимизированном коде?
- Почему моя собственная версия оцифровки намного быстрее, чем numpy.digitize, но все же медленнее, чем Matlab (я совершенно уверен, что использую самый быстрый алгоритм из возможных), учитывая, что я предполагаю, что входные данные уже отсортированы)?
Я использую Fedora 16, и я недавно установил библиотеки ATLAS и LAPACK (но производительность изменилась).Должен ли я, возможно, восстановить NumPy?Я не уверен, использует ли моя установка numpy соответствующие библиотеки для достижения максимальной скорости, возможно, Matlab использует лучшие библиотеки.
Обновление
На основании ответов на данный моментЯ хотел бы подчеркнуть, что функция Matlab histc не не эквивалентна to numpy.histogram , если кто-то (как я в этом случае) не заботится огистограмма.Мне нужен второй вывод hisc, который представляет собой отображение входных значений на индекс предоставленных входных лотков.Такой вывод обеспечивается с помощью простых функций digitize и searchsorted .Как говорится в одном из ответов, сортировка поиска намного быстрее, чем оцифровка .Тем не менее, сортировка поиска все еще медленнее, чем Matlab, в 2 :
t1=time.time()
ind3=np.searchsorted(y,scale,"right")
t2=time.time()
print 'Time passed is %2.2f seconds' %(t2-t1)
np.all(ind==ind3) #ok
Результат -
Прошедшее время составляет 0,21 секунды
Итак, вопросы теперь:
Какой смысл иметь numpy.digitize , если есть эквивалентная функция numpy.searchsorted что * в 1093 * 280 раз быстрее ?
Почему функция Matlab histc (которая также обеспечивает вывод numpy.поиск отсортирован ) в 2 раза быстрее , чем numpy.searchsorted ?