|
Packit Service |
99d393 |
PYTHON setup.py build_ext --inplace
|
|
Packit Service |
99d393 |
PYTHON test_profile.py
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
######## setup.py ###########
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
from distutils.extension import Extension
|
|
Packit Service |
99d393 |
from distutils.core import setup
|
|
Packit Service |
99d393 |
from Cython.Build import cythonize
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
extensions = [
|
|
Packit Service |
99d393 |
Extension("collatz", ["collatz.pyx"], define_macros=[('CYTHON_TRACE', '1')])
|
|
Packit Service |
99d393 |
]
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
setup(
|
|
Packit Service |
99d393 |
ext_modules = cythonize(extensions)
|
|
Packit Service |
99d393 |
)
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
######## test_profile.py ###########
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
try:
|
|
Packit Service |
99d393 |
import line_profiler
|
|
Packit Service |
99d393 |
except ImportError:
|
|
Packit Service |
99d393 |
print("No line profiler, skipping test.")
|
|
Packit Service |
99d393 |
import sys
|
|
Packit Service |
99d393 |
sys.exit(0)
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
def assert_stats(profile, name):
|
|
Packit Service |
99d393 |
profile.print_stats()
|
|
Packit Service |
99d393 |
stats = profile.get_stats()
|
|
Packit Service |
99d393 |
assert len(stats.timings) > 0, "No profile stats."
|
|
Packit Service |
99d393 |
for key, timings in stats.timings.items():
|
|
Packit Service |
99d393 |
if key[-1] == name:
|
|
Packit Service |
99d393 |
assert len(timings) > 0
|
|
Packit Service |
99d393 |
break
|
|
Packit Service |
99d393 |
else:
|
|
Packit Service |
99d393 |
raise ValueError("No stats for %s." % name)
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
from collatz import collatz
|
|
Packit Service |
99d393 |
func = collatz
|
|
Packit Service |
99d393 |
profile = line_profiler.LineProfiler(func)
|
|
Packit Service |
99d393 |
profile.runcall(func, 19)
|
|
Packit Service |
99d393 |
assert_stats(profile, func.__name__)
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
from collatz import cp_collatz
|
|
Packit Service |
99d393 |
func = cp_collatz
|
|
Packit Service |
99d393 |
profile = line_profiler.LineProfiler(func)
|
|
Packit Service |
99d393 |
profile.runcall(func, 19)
|
|
Packit Service |
99d393 |
assert_stats(profile, func.__name__)
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
from collatz import run_generator, cy_generator
|
|
Packit Service |
99d393 |
func = cy_generator
|
|
Packit Service |
99d393 |
profile = line_profiler.LineProfiler(func)
|
|
Packit Service |
99d393 |
profile.runcall(run_generator, 19)
|
|
Packit Service |
99d393 |
assert_stats(profile, func.__name__)
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
from collatz import run_coro, cy_coro
|
|
Packit Service |
99d393 |
func = cy_coro
|
|
Packit Service |
99d393 |
profile = line_profiler.LineProfiler(func)
|
|
Packit Service |
99d393 |
profile.runcall(run_coro, 19)
|
|
Packit Service |
99d393 |
assert_stats(profile, func.__name__)
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
from collatz import PyClass
|
|
Packit Service |
99d393 |
obj = PyClass()
|
|
Packit Service |
99d393 |
func = obj.py_pymethod
|
|
Packit Service |
99d393 |
profile = line_profiler.LineProfiler(func)
|
|
Packit Service |
99d393 |
profile.runcall(func)
|
|
Packit Service |
99d393 |
assert_stats(profile, func.__name__)
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
from collatz import CClass
|
|
Packit Service |
99d393 |
obj = CClass()
|
|
Packit Service |
99d393 |
func = obj.c_pymethod
|
|
Packit Service |
99d393 |
profile = line_profiler.LineProfiler(func)
|
|
Packit Service |
99d393 |
profile.runcall(func)
|
|
Packit Service |
99d393 |
assert_stats(profile, func.__name__)
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
func = obj.cp_pymethod
|
|
Packit Service |
99d393 |
profile = line_profiler.LineProfiler(func)
|
|
Packit Service |
99d393 |
profile.runcall(func, 19)
|
|
Packit Service |
99d393 |
assert_stats(profile, func.__name__)
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
######## collatz.pyx ###########
|
|
Packit Service |
99d393 |
# cython: linetrace=True
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cimport cython
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
@cython.binding(True)
|
|
Packit Service |
99d393 |
def collatz(n):
|
|
Packit Service |
99d393 |
while n > 1:
|
|
Packit Service |
99d393 |
if n % 2 == 0:
|
|
Packit Service |
99d393 |
n //= 2
|
|
Packit Service |
99d393 |
else:
|
|
Packit Service |
99d393 |
n = 3*n+1
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
@cython.binding(True)
|
|
Packit Service |
99d393 |
cpdef cp_collatz(n):
|
|
Packit Service |
99d393 |
while n > 1:
|
|
Packit Service |
99d393 |
if n % 2 == 0:
|
|
Packit Service |
99d393 |
n //= 2
|
|
Packit Service |
99d393 |
else:
|
|
Packit Service |
99d393 |
n = 3*n+1
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
@cython.binding(True)
|
|
Packit Service |
99d393 |
def cy_generator(int n):
|
|
Packit Service |
99d393 |
x = 1
|
|
Packit Service |
99d393 |
for i in range(n):
|
|
Packit Service |
99d393 |
yield x + 2
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
@cython.binding(True)
|
|
Packit Service |
99d393 |
def run_generator(n):
|
|
Packit Service |
99d393 |
assert len(list(cy_generator(n))) == n
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
@cython.binding(True)
|
|
Packit Service |
99d393 |
async def cy_coro(int n):
|
|
Packit Service |
99d393 |
while n > 1:
|
|
Packit Service |
99d393 |
if n % 2 == 0:
|
|
Packit Service |
99d393 |
n //= 2
|
|
Packit Service |
99d393 |
else:
|
|
Packit Service |
99d393 |
n = 3*n+1
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
@cython.binding(True)
|
|
Packit Service |
99d393 |
def run_coro(n):
|
|
Packit Service |
99d393 |
coro = cy_coro(n)
|
|
Packit Service |
99d393 |
try:
|
|
Packit Service |
99d393 |
coro.send(None)
|
|
Packit Service |
99d393 |
except StopIteration:
|
|
Packit Service |
99d393 |
assert True
|
|
Packit Service |
99d393 |
else:
|
|
Packit Service |
99d393 |
assert False, "Coroutine did not raise"
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
@cython.binding(True)
|
|
Packit Service |
99d393 |
class PyClass(object):
|
|
Packit Service |
99d393 |
def py_pymethod(self):
|
|
Packit Service |
99d393 |
x = 1
|
|
Packit Service |
99d393 |
for i in range(10):
|
|
Packit Service |
99d393 |
a = x + 2
|
|
Packit Service |
99d393 |
return a * 3
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
@cython.binding(True)
|
|
Packit Service |
99d393 |
cdef class CClass:
|
|
Packit Service |
99d393 |
def c_pymethod(self, c=2):
|
|
Packit Service |
99d393 |
for i in range(10):
|
|
Packit Service |
99d393 |
a = c + 1
|
|
Packit Service |
99d393 |
y = self.cmethod(c + a)
|
|
Packit Service |
99d393 |
return y * 4
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cpdef cp_pymethod(self, r):
|
|
Packit Service |
99d393 |
for i in range(10):
|
|
Packit Service |
99d393 |
a = r + 1
|
|
Packit Service |
99d393 |
z = self.c_pymethod(a) + self.cmethod(r)
|
|
Packit Service |
99d393 |
return z * 2
|
|
Packit Service |
99d393 |
|
|
Packit Service |
99d393 |
cdef cmethod(self, s):
|
|
Packit Service |
99d393 |
for i in range(10):
|
|
Packit Service |
99d393 |
p = s + 3
|
|
Packit Service |
99d393 |
return p * 5
|