Типы переменных при конвертации python в cython - PullRequest
0 голосов
/ 05 апреля 2020

Я работаю в Python с рекурсивной l oop, которая вычисляет время первого перехода к точке L случайного блуждания. Я написал код, но хочу оптимизировать его, преобразовав его в Cython, но у меня нет опыта работы с C, и я не знаю, как преобразовать этот код, чтобы он подходил для оптимизации, или как описать типы переменных. Любая помощь будет оценена.

%%cython
import numpy as np
cimport numpy as np

def f_passagetime_rec_cython(L,start=[0,0]):


    T=10000000
    r = np.zeros((T,2))
    r[0]=start
    delta = 1
    greater=False
    for i in range (0,T - 1):
        if r[i,0]<=L:
            theta = np.random.uniform(0, 2*np.pi, size = None)
            r[i + 1,0] = r[i,0] + np.cos(theta)*delta                
            r[i + 1,1] = r[i,1] + np.sin(theta)*delta
        else:
            greater=True
            return i


    if greater==False:
        x=f_passagetime_rec_cython(L,r[-1])
        i=x+1+i

    return i

1 Ответ

0 голосов
/ 05 апреля 2020

Вот как я бы предложил цитонизировать. Создайте файл setup.py:

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("function.pyx")
)

Тогда ваш файл function.pyx в основном будет вашим python кодом:

import numpy as np

def f_passagetime_rec_cython(L,start=[0,0]):


    T=10000000
    r = np.zeros((T,2))
    r[0]=start
    delta = 1
    greater=False
    for i in range (0,T - 1):
        if r[i,0]<=L:
            theta = np.random.uniform(0, 2*np.pi, size = None)
            r[i + 1,0] = r[i,0] + np.cos(theta)*delta                
            r[i + 1,1] = r[i,1] + np.sin(theta)*delta
        else:
            greater=True
            return i


    if greater==False:
        x=f_passagetime_rec_cython(L,r[-1])
        i=x+1+i

    return i

Затем создайте функцию cythonised в терминале следующим образом:

python setup.py build_ext --inplace

Вы можете получить доступ к функции Cythonised, импортировав, используя стандартный синтаксис Python:

import function
function.f_passagetime_rec_cython(10)
...