【问题标题】:speed up a python wrapper for a scipy function加速 scipy 函数的 python 包装器
【发布时间】:2020-06-02 12:06:08
【问题描述】:

我需要为scipy.stats 函数创建一个简单包装器的快速python 实现。这个函数只接受向量而不接受矩阵。下面的包装器是两个实现,但都具有相似的运行时间。 是否可以在不将实现转移到 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)

非常感谢

【问题讨论】:

    标签: python python-3.x performance scipy scipy.stats


    【解决方案1】:

    1) 在您的 wrap1 函数中,预先分配 corr 和 p_value 的数组,并填充它们而不是附加到列表中。

    2) 用 np.asarray(X) 替换 np.array(X) --- 如果 X 已经是一个数组,这将避免复制它。

    如果停留在 python 级别,这可能是您可以轻松完成的所有事情。

    如果这还不够,您可以尝试分析 kendalltau 函数。有相当多的事情发生,如果你看到有很大一部分时间花在例如检查您的数组中的 nan 值并且您确定您的输入没有这些值,您可以将 scipy 实现的相关部分复制粘贴到您的代码中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 2020-06-15
      • 2018-03-07
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      相关资源
      最近更新 更多