我有一个由基本数学函数(abs、cosh、sinh、exp等)组合定义的函数。
我想知道使用 numpy.abs()
而不是 abs()
是否会在速度上有所差异?
我有一个由基本数学函数(abs、cosh、sinh、exp等)组合定义的函数。
我想知道使用 numpy.abs()
而不是 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)
要慢,后者快约30%,但仍然比NumPy慢得多。)
因此,对于1000个元素而言,numpy.abs()
所需的时间与1个单独的浮点数差别不大!
timeit
命令中给出的 -s
选项:import numpy
实际上只在 设置 期间执行了 一次,并不会计时。至于 abs()
的示例,用 x
替换 abs(x)
后可以看出 abs()
使用了一半的总运行时间。无论如何,重点仍然相同:与纯(CPython 解释的)Python 相比,NumPy 真的非常快。 - Eric O. Lebigot您应该使用numpy函数来处理numpy的类型,使用常规python函数来处理常规python类型。
最差的性能通常出现在混合使用python内置类型和numpy时,因为需要进行类型转换。虽然这些类型转换已经得到了优化,但不使用它们通常仍然更好。当然,效果因人而异,所以请使用分析工具来找出最佳方案。
此外,考虑使用像cython这样的程序或制作C模块,如果您想进一步优化程序。或者在性能要求高时不使用python。
但是,当您的数据被放入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.abs(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
timeit
。 - Humphrey Bogartmath.abs()
。我猜你是指abs()
? - Eric O. Lebigot