NumPy数学函数比Python更快吗?

时间:2010-09-06 09:04:41

标签: python performance numpy

我有一个由基本数学函数(abs,cosh,sinh,exp,...)组合定义的函数。

我想知道它是否有所作为(速度)使用,例如, numpy.abs()代替abs()

3 个答案:

答案 0 :(得分:72)

以下是时间安排结果:

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个单个浮点数多!

答案 1 :(得分:25)

你应该使用numpy函数来处理numpy的类型,并使用常规的python函数来处理常规的python类型。

由于类型转换,在将python内置函数与numpy混合时通常会出现性能最差的情况。这些类型转换最近已经过优化,但最好不要使用它们。当然,您的里程可能会有所不同,因此请使用分析工具来确定。

如果您想进一步优化您的程序,还可以考虑使用cython等程序或制作C模块。或者考虑在表演很重要时不使用python。

但是,当你的数据被放入一个numpy数组时,numpy可以非常快地计算数据量。

答案 2 :(得分:5)

实际上,在numpy数组上

内置abs通过__abs__调用numpy的实现,请参阅Why built-in functions like abs works on numpy array?

因此,理论上应该没有太大的性能差异。

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