在python中,对于标量,math.acos()比numpy.arccos()快吗?

在python中,对于标量,math.acos()比numpy.arccos()快吗?,python,math,numpy,Python,Math,Numpy,我正在用Python进行一些科学计算,并进行了大量的几何计算,我发现使用numpy与标准math库之间存在显著差异 >>> x = timeit.Timer('v = np.arccos(a)', 'import numpy as np; a = 0.6') >>> x.timeit(100000) 0.15387153439223766 >>> y = timeit.Timer('v = math.acos(a)', 'import mat

我正在用Python进行一些科学计算,并进行了大量的几何计算,我发现使用
numpy
与标准
math
库之间存在显著差异

>>> x = timeit.Timer('v = np.arccos(a)', 'import numpy as np; a = 0.6')
>>> x.timeit(100000)
0.15387153439223766
>>> y = timeit.Timer('v = math.acos(a)', 'import math; a = 0.6')
>>> y.timeit(100000)
0.012333301827311516

这比10倍的加速还快!我对几乎所有的标准数学函数都使用numpy,我只是假设它经过了优化,至少与
math
一样快。在足够长的时间里,numpy.arccos()最终将战胜math.acos()循环,但由于我只使用标量的情况,因此全面使用math.acos()、math.asin()、math.atan()代替numpy版本有什么不利之处吗?

使用
数学模块中的函数作为标量是完全可以的。由于以下原因,功能可能会变慢

  • 将结果转换回python类型

如果性能上的差异对您的问题很重要,您应该检查是否确实不能使用数组操作。正如在评论中所说,数组是
numpy
真正擅长的东西。

用数组而不是标量来测试可能更有意义。这就是numpy优化的目的。“因为我只使用标量情况”-那么要么你的应用程序完全不适合numpy,要么你以一种非常低效的方式实现了你的应用程序。NumPy完全是关于数组的。我认为这是因为math.acos是一个内置函数,用于标量,而像np.arccos这样的NumPy UFUNC在处理数组方面有开销(根据参数是否是数组进行调度),如果你做了足够多的这些操作,它们的速度很重要,您可能应该使用数组和NumPy整数组操作,而不是
math.which