为什么 numba 在这个简单的总结上要快得多?
why is numba so much faster on this simple summation?
我有一个 public 笔记本,其中 python、numpy、numba、cython 和 fortran 在简单求和上进行了比较:
https://gist.github.com/denfromufa/7727874c4fe1e7e174ed953930e93bbc
为什么 numba 快这么多?
正如@DavidW 所指出的,您实际上并没有对相同的算法进行比较。下面我为每个 cython 和 numba 编写了两个独立的函数来做同样的事情。第一个对数组进行操作,第二个只是给定一个整数:
赛通:
cpdef long cy_sum(long[:] A):
cdef long i, n = A.shape[0], s = 0
for i in range(n):
s += A[i]
return s
cpdef long cy_sum2(long i):
cdef long s, x
s = 0
for x in range(i):
s += x
return s
数巴:
@nb.jit(nopython=True)
def nb_sum(A):
s=0
n = A.shape[0]
for i in range(n):
s += A[i]
return s
@nb.jit(nopython=True)
def nb_sum2(i):
s=0
for x in range(i):
s+=x
return s
测试以确保它们给出相同的结果:
N = int(1e6)
d = np.arange(N, dtype=np.int64)
print np.allclose(nb_sum(d), cy_sum(d)) # True
print np.allclose(nb_sum2(N), cy_sum2(N)) # True
我硬件上的时间:
%timeit cy_sum(d)
%timeit nb_sum(d)
1000 loops, best of 3: 416 µs per loop
1000 loops, best of 3: 237 µs per loop
%timeit cy_sum2(N)
%timeit nb_sum2(N)
10000000 loops, best of 3: 63.5 ns per loop
10000000 loops, best of 3: 187 ns per loop
我不会从这样的微基准测试中得出太多结论,但至少现在正在比较等效的实现。
我有一个 public 笔记本,其中 python、numpy、numba、cython 和 fortran 在简单求和上进行了比较:
https://gist.github.com/denfromufa/7727874c4fe1e7e174ed953930e93bbc
为什么 numba 快这么多?
正如@DavidW 所指出的,您实际上并没有对相同的算法进行比较。下面我为每个 cython 和 numba 编写了两个独立的函数来做同样的事情。第一个对数组进行操作,第二个只是给定一个整数:
赛通:
cpdef long cy_sum(long[:] A):
cdef long i, n = A.shape[0], s = 0
for i in range(n):
s += A[i]
return s
cpdef long cy_sum2(long i):
cdef long s, x
s = 0
for x in range(i):
s += x
return s
数巴:
@nb.jit(nopython=True)
def nb_sum(A):
s=0
n = A.shape[0]
for i in range(n):
s += A[i]
return s
@nb.jit(nopython=True)
def nb_sum2(i):
s=0
for x in range(i):
s+=x
return s
测试以确保它们给出相同的结果:
N = int(1e6)
d = np.arange(N, dtype=np.int64)
print np.allclose(nb_sum(d), cy_sum(d)) # True
print np.allclose(nb_sum2(N), cy_sum2(N)) # True
我硬件上的时间:
%timeit cy_sum(d)
%timeit nb_sum(d)
1000 loops, best of 3: 416 µs per loop
1000 loops, best of 3: 237 µs per loop
%timeit cy_sum2(N)
%timeit nb_sum2(N)
10000000 loops, best of 3: 63.5 ns per loop
10000000 loops, best of 3: 187 ns per loop
我不会从这样的微基准测试中得出太多结论,但至少现在正在比较等效的实现。