Acelerando el código python con cython.

Tengo una función que básicamente hace muchas llamadas a una función hash definida simple y prueba para ver cuándo encuentra un duplicado. Tengo que hacer muchas simulaciones con él, así que me gustaría que fuera lo más rápido posible. Estoy tratando de usar cython para hacer esto. El código de cython se llama actualmente con una lista normal de python de enteros con valores en el rango de 0 a m ^ 2.

import math, random
cdef int a,b,c,d,m,pos,value, cyclelimit, nohashcalls   
def h3(int a,int b,int c,int d, int m,int x):
    return (a*x**2 + b*x+c) %m    
def floyd(inputx):
    dupefound, nohashcalls = (0,0)
    m = len(inputx)
    loops = int(m*math.log(m))
    for loopno in xrange(loops):
        if (dupefound == 1):
            break
        a = random.randrange(m)
        b = random.randrange(m)
        c = random.randrange(m)
        d = random.randrange(m)
        pos = random.randrange(m)
        value = inputx[pos]
        listofpos = [0] * m
        listofpos[pos] = 1
        setofvalues = set([value])
        cyclelimit = int(math.sqrt(m))
        for j in xrange(cyclelimit):
            pos = h3(a,b, c,d, m, inputx[pos])
            nohashcalls += 1    
            if (inputx[pos] in setofvalues):
                if (listofpos[pos]==1):
                    dupefound = 0
                else:
                    dupefound = 1
                    print "Duplicate found at position", pos, " and value", inputx[pos]
                break
            listofpos[pos] = 1
            setofvalues.add(inputx[pos])
    return dupefound, nohashcalls 

¿Cómo puedo convertir inputx y listofpos para utilizar matrices de tipo C y acceder a las matrices a velocidad C? ¿Hay otras aceleraciones que pueda usar? ¿Se pueden acelerar los valores de conjunto?

Para que haya algo con lo que comparar, 50 llamadas a floyd () con m = 5000 actualmente toman alrededor de 30 segundos en mi computadora.

Actualización: Fragmento de código de ejemplo para mostrar cómo se llama a floyd.

m = 5000
inputx = random.sample(xrange(m**2), m)
(dupefound, nohashcalls) = edcython.floyd(inputx)