Цитонизируйте функцию Python, чтобы сделать ее быстрее

Несколько недель назад я задал вопрос об увеличении скорости функции, написанной на Python. В то время TryPyPy обратил мое внимание на возможность использования Cython для этого. Он также любезно привел пример того, как я могу Cythonize этот фрагмент кода. Я хочу сделать то же самое с приведенным ниже кодом, чтобы увидеть, насколько быстро я могу это сделать, объявив типы переменных. У меня есть пара вопросов по этому поводу. Я видел Учебник на сайте cython.org, но у меня все еще есть вопросы. Они тесно связаны:

  1. Я не знаю ни одного C. Какие части мне нужно изучить, чтобы использовать Cython для объявления типов переменных?
  2. Какой тип C соответствует спискам и кортежам Python? Например, я могу использовать double в Cython для float в Python. Что мне делать со списками? В общем, где мне найти соответствующий тип C для данного типа Python.

Любой пример того, как я могу Cythonize приведенный ниже код, был бы действительно полезен. Я вставил в код комментарии, которые дают информацию о типе переменной.

class Some_class(object):
    ** Other attributes and functions **
    def update_awareness_status(self, this_var, timePd):
        '''Inputs: this_var (type: float)
           timePd (type: int)
           Output: None'''

        max_number = len(self.possibilities)
        # self.possibilities is a list of tuples.
        # Each tuple is a pair of person objects. 

        k = int(math.ceil(0.3 * max_number))
        actual_number = random.choice(range(k))
        chosen_possibilities = random.sample(self.possibilities, 
                                         actual_number)
        if len(chosen_possibilities) > 0:
            # chosen_possibilities is a list of tuples, each tuple is a pair
            # of person objects. I have included the code for the Person class
            # below.
            for p1,p2 in chosen_possibilities:

                # awareness_status is a tuple (float, int)
                if p1.awareness_status[1] < p2.awareness_status[1]:                   
                    if p1.value > p2.awareness_status[0]:
                        p1.awareness_status = (this_var, timePd)
                    else:
                        p1.awareness_status = p2.awareness_status
                elif p1.awareness_status[1] > p2.awareness_status[1]:
                    if p2.value > p1.awareness_status[0]:
                        p2.awareness_status = (price, timePd)
                    else:
                        p2.awareness_status = p1.awareness_status
                else:
                    pass     

class Person(object):                                         
    def __init__(self,id, value):
        self.value = value
        self.id = id
        self.max_val = 50000
        ## Initial awareness status.          
        self.awarenessStatus = (self.max_val, -1)
12
задан Mike Pennington 16 October 2011 в 23:41
поделиться