【发布时间】:2017-08-08 08:23:24
【问题描述】:
首先在这里使用 Numba。我读到 nopython 模式应该产生更快的代码,但是这个:
@jit(float64[:](int64[:], int64, float64), nopython=True)
def epsilon_bound(l, k, delta):
return l/k+np.sqrt(np.log(1/delta))*np.sqrt(1/(2*k))
@jit(float64(float64, int64, float64), nopython=False)
def sim_bin(epsilon, sims, delta):
k=10000
s = np.random.binomial(k, epsilon, size=(sims,))
print(nb.typeof(s))
bound = epsilon_bound(s, k, delta)
violations = np.greater(epsilon, bound)
return np.sum(violations)/float(sims)
%%time
a = sim_bin(0.1, 1_000_000, 0.1)
运行得更快:
array(int64, 1d, C)
CPU times: user 66.7 ms, sys: 0 ns, total: 66.7 ms
Wall time: 65.7 ms
比这个:
@jit(float64[:](int64[:], int64, float64), nopython=True)
def epsilon_bound(l, k, delta):
return l/k+np.sqrt(np.log(1/delta))*np.sqrt(1/(2*k))
@jit(float64(float64, int64, float64), nopython=True)
def sim_bin(epsilon, sims, delta):
k=10000
s = np.random.binomial(k, epsilon, size=(sims,))
#print(nb.typeof(s))
bound = epsilon_bound(s, k, delta)
violations = np.greater(epsilon, bound)
return np.sum(violations)/float(sims)
CPU times: user 4.94 s, sys: 8.02 ms, total: 4.95 s
Wall time: 4.93 s
运行 sim_bin.inspect_types() 表明第一个选项正在使用所有 pyobjects,而第二个选项正确推断所有类型。根据文档 (http://numba.pydata.org/numba-doc/0.31.0/glossary.html#term-nopython-mode),nopython 模式应该会产生更快的代码。 有谁知道发生了什么?一定有充分的理由,但我不熟悉使用 Numba。是因为我主要使用向量化的 numpy 函数吗?
谢谢!!
【问题讨论】:
-
当我运行这两段代码时,我发现没有性能差异。不过,一般来说,您希望忽略第一次运行 numba jitting 函数的时间,因为它包括 jitting 时间(所以使用
%timeit而不是%time)。 -
@JoshAdel 通过提供签名,您可以预编译函数,因此不需要编译运行。我看不到这些调用之间的时间差,但我绝对可以看到 jitted
np.random.binomial和未jitted 之间的时间差。 -
对不起,我忘了包括我使用的是哪个版本的 python 和 numba。它是 Linux 上的 python 3.6、numba 0.31、numpy 1.12。我将检查此回归是否已修复。感谢您的帮助。