In [1]:
%load_ext cython
In [2]:
%%cython
# cython: boundscheck=False
# cython: cdivision=True
cpdef long f1(long x, long y):
return x % y
cdef long f2(long x, long y):
return x % y
def pyf1(long[:] x, long[:] y):
cdef long result = 0
for i in range(x.shape[0]):
result += f1(x[i], y[i])
return result
def pyf2(long[:] x, long[:] y):
cdef long result = 0
for i in range(x.shape[0]):
result += f2(x[i], y[i])
return result
In [3]:
import numpy
x = numpy.random.randint(1, 100, 2**20)
y = numpy.random.randint(1, 100, 2**20)
print(x[:5])
In [4]:
%timeit pyf1(x, y)
%timeit pyf2(x, y)
In [5]:
%%cython
# cython: boundscheck=False
# cython: cdivision=True
cdef class A:
cpdef long f1(self, long x, long y):
return x % y
cdef long f2(self, long x, long y):
return x % y
def pyf1(self, long[:] x, long[:] y):
cdef long result = 0
for i in range(x.shape[0]):
result += self.f1(x[i], y[i])
return result
def pyf2(self, long[:] x, long[:] y):
cdef long result = 0
for i in range(x.shape[0]):
result += self.f2(x[i], y[i])
return result
In [6]:
obj = A()
%timeit obj.pyf1(x, y)
%timeit obj.pyf2(x, y)
In [7]:
%%cython
# cython: boundscheck=False
# cython: cdivision=True
cdef class A:
cpdef long f1(self, long x, long y):
return x % y
cdef long f2(self, long x, long y):
return x % y
cdef inline long f3(self, long x, long y):
return x % y
def pyf1(self, long[:] x, long[:] y):
cdef long result = 0
for i in range(x.shape[0]):
result += self.f1(x[i], y[i])
return result
def pyf2(self, long[:] x, long[:] y):
cdef long result = 0
for i in range(x.shape[0]):
result += self.f2(x[i], y[i])
return result
def pyf3(self, long[:] x, long[:] y):
cdef long result = 0
for i in range(x.shape[0]):
result += self.f3(x[i], y[i])
return result
In [8]:
obj = A()
%timeit obj.pyf1(x, y)
%timeit obj.pyf2(x, y)
%timeit obj.pyf3(x, y)
In [ ]: