NumPy的math函数比Python更快吗?
我有一个由基本的math函数(abs,cosh,sinh,exp,…)组合定义的函数。
我想知道是否使用(例如, numpy.abs()
而不是abs()
什么numpy.abs()
?
以下是时间结果:
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)
慢了一点,这个值比NumPy要慢大约30%。
因此,对于1000个元素, numpy.abs()
不会比1个单独的float更多的时间!
您应该使用numpy函数来处理numpy的types,并使用常规的python函数来处理常规的pythontypes。
由于types转换,当python buildin与numpy混合时,通常会出现最差的性能。 这些types转换最近已经进行了优化,但是最好不要使用它们。 当然,你的里程可能会有所不同,所以使用分析工具来弄清楚。
如果你想进一步优化你的程序,也要考虑使用像cython这样的程序或者创build一个C模块。 或者考虑在演出过程中不要使用python。
但是,当你的数据被放入一个numpy数组时,numpy可以真正快速地计算一堆数据。
其实在numpy数组上
内置abs
通过__abs__
调用numpy的实现,请参阅像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
NumPy,pandas和本地Python操作系统之间的速度排名因input大小而异。 当使用大pandasdataframe时,NumPy操作可能实际上在大尺寸input中丢失。
情况1:两个dataframe的大小(10,5)
NumPy赢在这里。
情况2:两个dataframe的大小(10000,5)
…在这里也是胜利
情况3:两个dataframe的大小(1e6,5)
但是,NumPy最终输给原生Python和大pandas,速度达到100万行input:
第三个结果是令人惊讶的。
注意:
所有这些testing运行在两个指定大小的随机np.ndarrays
上,即a = DataFrame(np.random.randn(10,5))
和b = DataFrame(np.random.randn(10,5))
。 例如,这些行动将是
-
%timeit np.add(a, b)
-
%timeit a + b
-
%timeit a.add(b)