NumPy的数学函数比Python的快吗?

eanckbw9  于 2023-01-17  发布在  Python
关注(0)|答案(3)|浏览(168)

我有一个由基本数学函数(abs、cosh、sinh、exp ......)组合定义的函数。
我想知道使用numpy.abs()而不是abs()是否(在速度上)有区别?

oxosxuxt

oxosxuxt1#

以下是计时结果:

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

eoxn13cs

eoxn13cs2#

应该使用numpy函数处理numpy的类型,使用正则python函数处理正则python类型。
最差的性能通常发生在python内置函数和numpy混合使用时,因为类型转换的原因,最近已经优化了类型转换,但是通常最好还是不要使用它们,当然,你的里程可能会有所不同,所以使用分析工具来找出原因。
如果你想进一步优化你的程序,也可以考虑使用像cython这样的程序或者制作一个C模块,或者在性能很重要的时候考虑不使用python。
但是,当你的数据被放入一个numpy数组中时,numpy在计算大量数据时会非常快。

uxhixvfz

uxhixvfz3#

实际上在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.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

相关问题