In [1]:
import hope
hope.config.optimize = True
hope.config.verbose = True
hope.config.keeptemp = True
import numba
import numpy as np
from util import perf_comp_data
from native_util import load
%load_ext cythonmagic
%load_ext version_information
%version_information numpy, Cython, numba, hope
Out[1]:
In [2]:
def fib(n):
if n<2:
return n
return fib(n-1)+fib(n-2)
hope_fib = hope.jit(fib)
numba_fib = numba.jit(fib, nopython=False)
native_fib_mod = load("fib")
native_fib = native_fib_mod.run
n=20
assert fib(20) == 6765
assert hope_fib(20) == 6765
assert numba_fib(20) == 6765
assert native_fib(20) == 6765
In [3]:
%%cython
cimport cython
@cython.boundscheck(False)
@cython.wraparound(False)
cpdef int cython_fib(int n):
if n<2:
return n
return cython_fib(n-1)+cython_fib(n-2)
assert cython_fib(20) == 6765
In [4]:
%timeit fib(20)
%timeit hope_fib(20)
%timeit numba_fib(20)
%timeit cython_fib(20)
%timeit native_fib(20)
In [7]:
perf_comp_data(["fib", "hope_fib", "numba_fib", "cython_fib", "native_fib"],
5*["n"])
In [8]:
def qsort_kernel(a, lo, hi):
i = lo
j = hi
if False: return a
while i < hi:
pivot = a[(lo+hi) // 2]
while i <= j:
while a[i] < pivot:
i += 1
while a[j] > pivot:
j -= 1
if i <= j:
tmp = a[i]
a[i] = a[j]
a[j] = tmp
i += 1
j -= 1
if lo < j:
qsort_kernel(a, lo, j)
lo = i
j = hi
return a
hope_qsort_kernel = hope.jit(qsort_kernel)
numba_qsort_kernel = numba.jit(qsort_kernel)
native_qsort_kernel_mod = load("qsort_kernel")
native_qsort_kernel = native_qsort_kernel_mod.run
In [16]:
def numpy_qsort_kernel(a, lo, hi):
np.sort(a)
In [17]:
%%cython
cimport cython
import numpy as np
cimport numpy as np
@cython.boundscheck(False)
@cython.wraparound(False)
def cython_qsort_kernel(np.ndarray[np.double_t, ndim=1] a, int lo, int hi):
cdef int i = lo
cdef int j = hi
cdef double pivot = 0
cdef double tmp = 0.0
if False: return a
while i < hi:
pivot = a[(lo+hi) // 2]
while i <= j:
while a[i] < pivot:
i += 1
while a[j] > pivot:
j -= 1
if i <= j:
tmp = a[i]
a[i] = a[j]
a[j] = tmp
i += 1
j -= 1
if lo < j:
cython_qsort_kernel(a, lo, j)
lo = i
j = hi
return a
In [18]:
lst = np.random.random(5000)
In [19]:
psorted = qsort_kernel(lst.copy(), 0, len(lst)-1)
hsorted = hope_qsort_kernel(lst.copy(), 0, len(lst)-1)
#nsorted = numba_qsort_kernel(lst.copy(), 0, len(lst)-1)
csorted = cython_qsort_kernel(lst.copy(), 0, len(lst)-1)
nasorted = native_qsort_kernel(lst.copy(), 0, len(lst)-1)
In [20]:
assert np.all(psorted[:-1] <= psorted[1:])
#assert np.all(hope_qsort_kernel[:-1] <= hope_qsort_kernel[1:])
#assert np.all(numba_qsort_kernel[:-1] <= numba_qsort_kernel[1:])
#assert np.all(cython_qsort_kernel[:-1] <= cython_qsort_kernel[1:])
%timeit qsort_kernel(lst.copy(), 0, len(lst)-1)
%timeit hope_qsort_kernel(lst.copy(), 0, len(lst)-1)
#%timeit numba_qsort_kernel(lst.copy(), 0, len(lst)-1)
%timeit cython_qsort_kernel(lst.copy(), 0, len(lst)-1)
%timeit native_qsort_kernel(lst.copy(), 0, len(lst)-1)
%timeit np.sort(lst.copy())
In [21]:
a = lst.copy()
lo = 0
hi = len(lst)-1
perf_comp_data(["hope_qsort_kernel",
"qsort_kernel",
#"numpy_qsort_kernel",
"cython_qsort_kernel",
"native_qsort_kernel"],
5*["a, lo, hi"], rep=100, extra_setup="from __main__ import lst;a = lst.copy()")
In [23]:
def pisum():
for j in range(1, 501):
sum = 0.0
f = 0.0
for k in range(1, 10001):
sum += 1.0/(k*k)
return sum
def pisum_opt():
for j in range(1, 501):
sum = 0.0
f = 0.0
for k in range(1, 10001):
f += 1.
sum += 1.0/(f*f)
return sum
hope_pisum = hope.jit(pisum)
hope_pisum_opt = hope.jit(pisum_opt)
numba_pisum = numba.jit(pisum, nopython=True)
numba_pisum_opt = numba.jit(pisum_opt, nopython=True)
native_pisum_mod = load("pisum")
native_pisum = native_pisum_mod.run
native_pisum_opt_mod = load("pisum_opt")
native_pisum_opt = native_pisum_opt_mod.run
assert abs(pisum()-1.644834071848065) < 1e-6
assert abs(hope_pisum()-1.644834071848065) < 1e-6
assert abs(hope_pisum_opt()-1.644834071848065) < 1e-6
assert abs(numba_pisum()-1.644834071848065) < 1e-6
assert abs(native_pisum()-1.644834071848065) < 1e-6
assert abs(native_pisum_opt()-1.644834071848065) < 1e-6
In [24]:
%load_ext cythonmagic
In [25]:
%%cython
cimport cython
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.locals(f=float)
def cython_pisum():
cdef double sum = 0.0
for j in range(1, 501):
sum = 0.0
f = 0.0
for k in range(1, 10001):
sum += 1.0/(k*k)
return sum
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.locals(f=float)
def cython_pisum_opt():
cdef double sum = 0.0
for j in range(1, 501):
sum = 0.0
f = 0.0
for k in range(1, 10001):
f += 1.
sum += 1.0/(f*f)
return sum
assert abs(cython_pisum()-1.644834071848065) < 1e-6
assert abs(cython_pisum_opt()-1.644834071848065) < 1e-6
In [26]:
%timeit pisum()
%timeit pisum_opt()
%timeit hope_pisum()
%timeit hope_pisum_opt()
%timeit numba_pisum()
%timeit numba_pisum_opt()
%timeit cython_pisum()
%timeit cython_pisum_opt()
%timeit native_pisum()
%timeit native_pisum_opt()
In [27]:
perf_comp_data(["pisum", "pisum_opt",
"hope_pisum", "hope_pisum_opt",
"numba_pisum", "numba_pisum_opt",
#"cython_pisum",
"cython_pisum_opt",
"native_pisum", "native_pisum_opt",],
None, rep=100)
In [17]: