summaryrefslogtreecommitdiff
path: root/docs/src/quickstart/demo.pyx
blob: a475dd03ca34ab60134d3c9b1fae2a81f130fb69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
from time import time
from math import sin

cdef double first_time = 0

def timeit(f, label):
    global first_time
    t = time()
    f(1.0, 2.0, 10**7)
    cdef double elapsed = time() - t
    if first_time == 0:
        first_time = elapsed
    print label, elapsed, (100*elapsed/first_time), '% or', first_time/elapsed, 'x'


# Pure Python

py_funcs = {'sin': sin}
py_funcs.update(__builtins__.__dict__)
exec """
def f(x):
      return x**2-x

def integrate_f(a, b, N):
      s = 0
      dx = (b-a)/N
      for i in range(N):
          s += f(a+i*dx)
      return s * dx

""" in py_funcs
timeit(py_funcs['integrate_f'], "Python")


# Just compiled

def f0(x):
    return x**2-x

def integrate_f0(a, b, N):
    s = 0
    dx = (b-a)/N
    for i in range(N):
        s += f0(a+i*dx)
    return s * dx

timeit(integrate_f0, "Cython")


# Typed vars

def f1(double x):
    return x**2-x

def integrate_f1(double a, double b, int N):
    cdef int i
    cdef double s, dx
    s = 0
    dx = (b-a)/N
    for i in range(N):
        s += f1(a+i*dx)
    return s * dx

timeit(integrate_f1, "Typed vars")


# Typed func

cdef double f2(double x) except? -2:
    return x**2-x

def integrate_f2(double a, double b, int N):
    cdef int i
    cdef double s, dx
    s = 0
    dx = (b-a)/N
    for i in range(N):
        s += f2(a+i*dx)
    return s * dx

timeit(integrate_f2, "Typed func")