我的代码可以使用一些加速 - 不幸的是瓶颈似乎已经在numpy代码中。令我惊讶的是np.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)
结果让我感到惊讶。 p_bar.sum()
超出竞争对手np.sum(p_bar)
2倍可能会暗示打出调用开销问题。
但为什么计算对数与总和相比如此之快?如果没有切换到c ++,有没有希望更快地获得这个?
请注意,p
的小尺寸代表了我必须解决的问题。