Ускорение Python кода с помощью Cython

У меня есть функция, которая в основном делает много вызовов простой определенной хэш-функции и проверяет, находит ли она дубликат. Мне нужно сделать много симуляций с ним, поэтому хотелось бы, чтобы он был максимально быстрым. Я пытаюсь использовать Cython для этого. Код cython в настоящее время вызывается с обычным списком чисел python со значениями в диапазоне от 0 до 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 

Как я могу преобразовать inputx и listofpos для использования массивов типа C и для доступа к массивам на скорости C? Могу ли я использовать другие ускорения? Можно ли ускорить набор значений?

Чтобы было с чем сравнивать, на моем компьютере 50 вызовов функции floyd () с m = 5000 в настоящее время занимают около 30 секунд.

Обновление: пример фрагмента кода, показывающий, как вызывается floyd.

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

Ответы на вопрос(2)

Ваш ответ на вопрос