我有一个由基本数学函数(abs,cosh,sinh,exp,...)组合定义的函数。
我想知道它是否有所作为(速度)使用,例如,
numpy.abs()
代替abs()
?
答案 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