Python 小型阵列上的numpy和性能

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)

我有一些代码,可以利用一些加速-不幸的是瓶颈似乎已经在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)
    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倍),这在那些小数据集上表现出来。