3 ответов:
вот результаты:
lebigot@weinberg ~ % python -m timeit 'abs(3.15)' 10000000 loops, best of 3: 0.146 usec per loop lebigot@weinberg ~ % python -m timeit -s 'from numpy import abs as nabs' 'nabs(3.15)' 100000 loops, best of 3: 3.92 usec per loop
numpy.abs()медленнее, чемabs(), потому что он также обрабатывает массивы numpy: он содержит дополнительный код, который обеспечивает эту гибкость.Однако, Numpy и быстро на массивы:
lebigot@weinberg ~ % python -m timeit -s 'a = [3.15]*1000' '[abs(x) for x in a]' 10000 loops, best of 3: 186 usec per loop lebigot@weinberg ~ % python -m timeit -s 'import numpy; a = numpy.empty(1000); a.fill(3.15)' 'numpy.abs(a)' 100000 loops, best of 3: 6.47 usec per loop(PS:
'[abs(x) for x in a]'медленнее в Python 2.7, чем лучшеmap(abs, a), что примерно на 30% быстрее-что все еще намного медленнее, чем NumPy.)таким образом,
numpy.abs()не занимает намного больше времени для 1000 элементов, чем за 1 один поплавок!
вы должны использовать функции numpy для борьбы с видами библиотеки numpy и использовать обычные функции Python для борьбы с обычными типами кожи питона.
худшая производительность обычно возникает при смешивании Python builtins с numpy из-за преобразования типов. Эти преобразования типов были оптимизированы в последнее время, но по-прежнему часто лучше не использовать их. Конечно, ваш пробег может отличаться, поэтому используйте инструменты профилирования, чтобы выяснить.
также рассмотрите использование таких программ, как cython или создание C модуль, если вы хотите дополнительно оптимизировать свою программу. Или подумайте, чтобы не использовать python, когда производительность имеет значение.
но, когда ваши данные были помещены в массив numpy, то numpy может быть очень быстрым при вычислении кучу данных.
на самом деле, на массиве numpy
построен в
absвызывает реализацию numpy через__abs__см. почему встроенные функции, такие как abs, работают на массиве numpy?Так, в теории не должно быть большой разницы в производительности.
import timeit x = np.random.standard_normal(10000) def pure_abs(): return abs(x) def numpy_abs(): return np.absolute(x) n = 10000 t1 = timeit.timeit(pure_abs, number = n) print 'Pure Python abs:', t1 t2 = timeit.timeit(numpy_abs, number = n) print 'Numpy abs:', t2 Pure Python abs: 0.435754060745 Numpy abs: 0.426516056061
Comments