In [1]:
%load_ext Cython

In [4]:
%%cython
def summer1(double[:] mv):
    """Sums its argument's contents."""
    cdef double d, ss=0.0
    for d in mv:
        ss += d
    return ss

In [5]:
import numpy as np

arr = np.ones((10**6,), dtype=np.double)

In [7]:
%timeit -n3 -r3 summer1(arr)


3 loops, best of 3: 199 ms per loop

In [9]:
from array import array

ar = array('d', [1]*10**6)

In [10]:
%timeit -n3 -r3 summer1(ar)


3 loops, best of 3: 197 ms per loop

In [26]:
%%cython
def summer2(double[:] mv):
    """Sums its argument's contents."""
    cdef:
        double ss=0.0
        int i, N
    N = mv.shape[0]
    for i in range(N):
        ss += mv[i]
    return ss

In [29]:
%timeit -n3 -r3 summer2(arr)


3 loops, best of 3: 1.04 ms per loop

In [28]:
%timeit -n3 -r3 summer2(ar)


3 loops, best of 3: 1.02 ms per loop

In [73]:
%%cython
from cython cimport wraparound, boundscheck

@boundscheck(False)
@wraparound(False)
cpdef double summer3(double[:] mv):
    """Sums its argument's contents."""
    cdef:
        double ss=0.0
        int i, N
    N = mv.shape[0]
    for i in range(N):
        ss += mv[i]
    return ss

In [74]:
%timeit -n3 -r3 summer3(arr)


3 loops, best of 3: 1.05 ms per loop

In [75]:
%timeit -n3 -r3 arr.sum()


3 loops, best of 3: 726 µs per loop