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)