为 scipy 函数加速 python 包装器
speed up a python wrapper for a scipy function
我需要为 scipy.stats
函数创建一个简单包装器的快速 python 实现。该函数只接受向量而不接受矩阵。下面的 Wrappers 是两个实现,但都具有相似的 运行 次。
是否可以在不将实现移动到 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) 在您的 wrap1 函数中,预先分配 corr 和 p_value 的数组,并填充它们而不是附加到列表中。
2) 将 np.array(X) 替换为 np.asarray(X) --- 如果它已经是一个数组,这将避免复制 X。
如果保持 python 水平,这可能就是您可以轻松完成的所有工作。
如果这还不够,您可以尝试分析 kendalltau 函数。发生了很多事情,如果您看到大部分时间花在例如检查你的数组是否有 nan 值,你确定你的输入没有这些,你可以将 scipy 实现的相关部分复制粘贴到你的代码中。
我需要为 scipy.stats
函数创建一个简单包装器的快速 python 实现。该函数只接受向量而不接受矩阵。下面的 Wrappers 是两个实现,但都具有相似的 运行 次。
是否可以在不将实现移动到 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) 在您的 wrap1 函数中,预先分配 corr 和 p_value 的数组,并填充它们而不是附加到列表中。
2) 将 np.array(X) 替换为 np.asarray(X) --- 如果它已经是一个数组,这将避免复制 X。
如果保持 python 水平,这可能就是您可以轻松完成的所有工作。
如果这还不够,您可以尝试分析 kendalltau 函数。发生了很多事情,如果您看到大部分时间花在例如检查你的数组是否有 nan 值,你确定你的输入没有这些,你可以将 scipy 实现的相关部分复制粘贴到你的代码中。