Python 小型阵列上的numpy和性能
我有一些代码,可以利用一些加速-不幸的是瓶颈似乎已经在numpy代码。令我惊讶的是,sum函数而不是对数占用了大部分时间 这是一个玩具示例:Python 小型阵列上的numpy和性能,python,numpy,Python,Numpy,我有一些代码,可以利用一些加速-不幸的是瓶颈似乎已经在numpy代码。令我惊讶的是,sum函数而不是对数占用了大部分时间 这是一个玩具示例: import numpy as np from scipy.special import xlogy p = np.random.rand(20,4) def many_foo(p): for i in range(100000): foo(p) def foo(p): p_bar = xlogy(p, p)
import numpy as np
from scipy.special import xlogy
p = np.random.rand(20,4)
def many_foo(p):
for i in range(100000):
foo(p)
def foo(p):
p_bar = xlogy(p, p)
p_sum = p_bar.sum()
p_sum = np.sum(p_bar)
kern_prof(%lprun-f foo many_foo(p)
)给出了以下行分析:
Timer unit: 1e-06 s
Total time: 1.43734 s
File: <ipython-input-63-8f7d1e3cad35>
Function: foo at line 10
Line # Hits Time Per Hit % Time Line Contents
==============================================================
10 def foo(p):
11 100000 259856 2.6 18.1 p_bar = xlogy(p, p)
12 100000 404256 4.0 28.1 p_sum = p_bar.sum()
13 100000 773232 7.7 53.8 p_sum = np.sum(p_bar)
定时器单元:1e-06秒
总时间:1.43734秒
文件:
功能:第10行的foo
行#每次命中的命中次数%时间行内容
==============================================================
10 def foo(p):
11 100000 259856 2.6 18.1 p_bar=xlogy(p,p)
12 100000 404256 4.0 28.1 p_sum=p_bar.sum()
13 100000 773232 7.7 53.8 p_总和=np总和(p_巴)
结果令我惊讶p_-bar.sum()
超过np.sum(p_-bar)
的2倍可能会导致调用开销问题
但是为什么计算对数比求和要快呢?还有没有希望在不切换到C++的情况下更快地获得这个?
请注意,
p
的小维度代表了我必须解决的问题。我得到了xlogy(p,p)
和np.sum(p_bar)
的可比运行时。使用%timeit
。timeit对我来说是一样的np.sum
慢2.5倍。也许continuum的mkl blas库负责。。。hmhm@Divakar对于我来说,在macos numpy(mkl和openblas)和linux numpy(mkl)上,使用p=np.random.rand(20,4)
xlogy
的性能比np.sum
好至少两倍。当我进一步减小数据量时,p=np.random.rand(5,4)
。因此,它也可能依赖于硬件/资源。此外,np.sum
的函数调用开销比xlogy
的要大得多(超过2倍),这在那些小数据集上表现出来。