Несколько недель назад я задал вопрос об увеличении скорости функции, написанной на Python. В то время TryPyPy привлек мое внимание к возможности использования Cython для этого. Он также любезно привел пример того, как я мог бы цитонировать этот фрагмент кода. Я хочу сделать то же самое с приведенным ниже кодом, чтобы узнать, как быстро я могу это сделать, объявив типы переменных. У меня есть пара вопросов, связанных с этим. Я видел учебник на cython.org, но у меня все еще есть некоторые вопросы. Они тесно связаны:
- Я не знаю никаких C. Какие части мне нужно узнать, чтобы использовать Cython для объявления переменных типов?
- Что такое тип C, соответствующий спискам и кортежам python? Например, я могу использовать
double
в Cython дляfloat
в Python. Что мне делать для списков? В общем, где я могу найти соответствующий тип C для данного типа Python.
Любой пример того, как я мог бы цитологизировать приведенный ниже код, был бы действительно полезен. Я добавил комментарии в код, который предоставляет информацию о типе переменной.
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)