ускорить python оболочку для функции scipy - PullRequest
0 голосов
/ 18 февраля 2020

Мне нужно создать быструю python реализацию простой оболочки для функции scipy.stats. Эта функция принимает только векторы, а не матрицы. Оболочки ниже являются двумя реализациями, но оба имеют одинаковое время выполнения. Можно ли ускорить выполнение любого из них, не перемещая реализацию в домен C / C ++.

import numpy as np
from scipy.stats import kendalltau

def wrap1(X, y):
    corr = []
    p_value = []
    X = np.array(X).transpose()
    y = np.ravel(y)
    for col in X:
        ktau = kendalltau(col, y, nan_policy='raise')
        corr.append(ktau[0])
        p_value.append(ktau[1])
    return corr, p_value

##########Version2

def wrap2(X, y):
        X = np.array(X).transpose()
        y = np.tile(np.ravel(y), (X.shape[0], 1))
        corr, p_value = zip(*[kendalltau(a, b, nan_policy='raise')
                              for a, b in zip(X, y)])
        return corr, p_value

Пример выполнения:

t1 = np.arange(30).reshape(10,3)
t2 = np.arange(10).reshape(10,)
wrap1(t1,t2)
wrap2(t1,t2)

Большое спасибо

1 Ответ

0 голосов
/ 18 февраля 2020

1) В вашей функции wrap1 предварительно выделите массивы corr и p_value и заполните их вместо добавления в списки.

2) замените np.array (X) на np.asarray (X) --- это позволит избежать создания копии X, если это уже массив.

Это, вероятно, все, что вы можете легко сделать, если останетесь на уровне python.

Если этого недостаточно, Вы можете попробовать профилировать функцию кендаллтау. Происходит довольно много времени, и если вы видите значительную долю времени, потраченного, например, на проверку массивов для значений nan, и вы уверены, что ваши входные данные не содержат их, вы можете скопировать и вставить соответствующие части реализации scipy в свой файл. код.

...