- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
首先在这里使用 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 0.31,windows 10)似乎是 np.random.binomial
调用。当我测试它时:
@jit(nopython=True)
def nbbinom():
return np.random.binomial(10000, 0.1, size=(1000000,))
nbbinom() # warmup
%timeit nbbinom()
# 1 loop, best of 3: 2.45 s per loop
%timeit np.random.binomial(10000, 0.1, size=(1000000,))
# 10 loops, best of 3: 23.1 ms per loop
但这可能取决于 numba 版本。 Numba(不幸的是)经常遭受性能退化的困扰,而这些性能退化(幸运的是)很快就得到了修复。可能它只需要在他们的错误跟踪器上有一个问题(如果它尚未修复)。
但即便如此,您的代码仍包含大量矢量化操作。如果您使用矢量化操作,您不会通过 numba 获得太多速度提升。作为一个经验法则:如果你已经可以在不使用 python 循环的情况下使用 numpy 来完成它,你就不需要 numba(也有异常(exception)。例如:我发现 numba 对于小数组来说肯定更快,其中numpy-ufuncs 有很大的开销)。
另一件事是创建随机数组比实际操作花费的时间长得多(在 numpy 和 numba 中):
import numpy as np
from numba import njit
@njit
def epsilon_bound1(l, k, delta):
return l/k+np.sqrt(np.log(1/delta))*np.sqrt(1/(2*k))
def epsilon_bound2(l, k, delta):
return l/k+np.sqrt(np.log(1/delta))*np.sqrt(1/(2*k))
def sim_bin(s, k, epsilon, sims, delta, func):
bound = func(s, k, delta)
violations = np.greater(epsilon, bound)
return np.sum(violations)/float(sims)
epsilon = 0.1
sims = 1000000
delta = 0.1
k=10000
s = np.random.binomial(k, epsilon, size=(sims,))
%timeit np.random.binomial(k, epsilon, size=(sims,))
# 1 loop, best of 3: 232 ms per loop
sim_bin(s, k, 0.1, 1000000, 0.1, epsilon_bound1) # warmup
%timeit sim_bin(s, k, 0.1, 1000000, 0.1, epsilon_bound1)
# 10 loops, best of 3: 28.5 ms per loop
%timeit sim_bin(s, k, 0.1, 1000000, 0.1, epsilon_bound2)
# 10 loops, best of 3: 37.6 ms per loop
因此,当您对 sim_bin
进行基准测试时,您实际上只对对 np.random.binomial
的调用进行基准测试,无论是相对较快的 numpy 还是(当前)相当慢的 numba 实现.
关于python - Numba - nopython 模式比对象模式慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42846313/
我想将一个类对象传递给一个函数。我可以让它工作,但我想知道是否有我可以分配的类型?我有一个我正在尝试做的“最小”示例。 spec = [("a", float64),("b",float64)] @j
我有一个简单的函数来对扑克手牌进行排序(手牌是字符串)。 我用 rA,rB = rank(a),rank(b) 调用它,这是我的实现。没有 @jit(nopython=True) 也能很好地工作,但是
我在这里有一个简单的例子来帮助我理解使用 numba 和 cython。我是 numba 和 cython 的新手。我已经尽力结合所有技巧来使 numba 更快,并且在某种程度上,cython 也是如
我正在使用 numbas @jit 装饰器在 python 中添加两个 numpy 数组。如果我使用 @jit 与 python 相比,性能是如此之高。 然而,即使我传入 @numba.jit(nop
我需要为通用指标构建相异矩阵。由于我需要算法快速运行,所以我在 nopython 模式下使用了 numba 0.35。这是我的代码 import numpy as np from numba impo
Numba Cuda 有 syncthreads() 来同步一个 block 中的所有线程。如何在不退出当前内核的情况下同步网格中的所有 block ? 在 C-Cuda 中有一个 cooperati
有人尝试在Google合作伙伴中使用numba吗?我只是不知道如何在此环境中进行设置。 此刻,我陷入了错误library nvvm not found。 最佳答案 将此代码复制到单元格中。这个对我有用
我想编写一个函数,它既可以作为 jitted 函数运行,也可以作为普通 python 或对象模式 numba 运行,具体取决于 numba 是否能够进行类型推断。我实际上更喜欢普通的 python,但
我有一个非常简单的问题我无法解决。 我正在使用 Numba 和 Cuda。我有一个列表 T=[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0] 我想要一个包含列表元素的元组,如
我正在测试一些采用 numpy 数组的函数的 numba 性能,并比较: import numpy as np from numba import jit, vectorize, float64 im
我正在使用 Scipy 的 interpolate.interp1d 在 Python3 中插入一维数组。我想将它与 numba 一起使用,但不支持 scipy 和此功能。是否有 numba 支持
我是 Numba 的新手,我正在尝试使用 Numba(版本 0.54.1)在 Python 中实现旧的 Fortran 代码,但是当我添加 parallel = True 时,程序实际上变慢了.我的程
我需要在 Python 中创建一个位数组。到目前为止,我发现可以使用 bitarray 生成非常节省内存的数组。模块。 然而,我的最终目的是使用来自Numba 的@vectorize 装饰器。 . N
我认为这是一个简单的问题,但我发现 numba 文档缺乏关于如何将字符串类型与 numpy 数组和字典一起使用的信息。我有一个我想使用 numba 的函数,它需要一个邮政编码列表,然后是一个映射邮政编
假设我有两个功能 def my_sub1(a): return a + 2 def my_main(a): a += 1 b = mysub1(a) return b
在以下用于逻辑比较的 numba 编译函数中,性能下降的原因可能是什么: from numba import njit t = (True, 'and_', False) #@njit(boolean
我的代码使用如下列表的笛卡尔积: import itertools cartesian_product = itertools.product(list('ABCDEF'), repeat=n) n可
我正在使用 Numba(版本 0.37.0)来优化 GPU 代码。我想使用组合矢量化函数(使用 Numba 的 @vectorize 装饰器)。 导入和数据: import numpy as np f
我想知道在 numba 函数中计算两个列表的交集的最快方法。只是为了澄清:两个列表的交集示例: Input : lst1 = [15, 9, 10, 56, 23, 78, 5, 4, 9] lst2
我正在使用 Numba 非 python 模式和一些 NumPy 函数。 @njit def invert(W, copy=True): ''' Inverts elementwise
我是一名优秀的程序员,十分优秀!