【问题标题】:Are NumPy's math functions faster than Python's?NumPy 数学函数比 Python 快吗?
【发布时间】:2011-04-08 16:33:17
【问题描述】:

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

我想知道使用它是否会有所不同(在速度方面),例如, numpy.abs() 而不是 abs()

【问题讨论】:

  • 使用timeit
  • 没有math.abs()。我猜你的意思是abs()
  • @EOL 是的,抱歉,我编辑了这个问题。谢谢

标签: python performance numpy


【解决方案1】:

以下是计时结果:

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

【讨论】:

  • 如果有 python -m timeit -s 'import numpy' -s 'a=numpy.array((1,)*1000)' 'numpy.abs(a) 的结果会很好' 来展示 numpy 可以如何快速使用它的数组
  • @EOL:您的时间似乎包括导入numpy,仅此一项就需要几秒钟。此外,在您的第二个示例中,我想知道 Python 的基本“abs”函数是否大部分时间来自您的列表理解而不是“abs”函数本身?
  • @tbhartman:请注意-s 赋予timeit 的选项:import numpy 实际上只在设置期间执行一次。它不是定时的。至于abs() 示例,将abs(x) 替换为x 表明abs() 使用了总运行时间的一半。在任何情况下,要点都是一样的:与纯(CPython 解释的)Python 相比,NumPy 确实快。
【解决方案2】:

其实在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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-16
      • 2021-11-27
      • 2016-07-23
      • 2013-08-24
      • 1970-01-01
      • 2020-10-10
      • 2014-08-17
      • 2018-03-20
      相关资源
      最近更新 更多