首页 > 解决方案 > 有没有办法优化这个 python 尝试,除了循环?

问题描述

通常,代码包含一个列表列表 ( series_),其中使用列表的初始值作为基础,搜索每个列表中满足特定条件的第一个值。

但是,某些列表不包含满足该标准的值(异常起作用并向Compra_列表添加任意值)。我有兴趣优化try/except部分,因为我正在处理数百万个数据并且运行代码需要几个小时。

for i in range(len(d)):
    series_.append(np.array(data2.Close[d[i]:]))


Compra_ = []
for i in series_:
    try:
        Compra_.append(next(filter(lambda x: x - i[0] >= TH or i[0] - x >= M*TH, i)))
    except:
        Compra_.append(i[0])

我知道这样的事情会起作用,但是当不满足标准时,它会停止迭代。

Compra_ = [next(filter(lambda x: x - i[0] >= TH or i[0] - x >= M*TH, i)) for i in series_]

标签: pythonoptimizationtry-catch

解决方案


您可以像这样简化和减少开销:

def compra():
    m_th = M*TH
    th = TH
    return [
        next(
            (x for x in xs if x - xs[0] >= th or xs[0] - x >= m_th),
            xs[0]
        )
        for xs in series_
    ]

Compra_ = compra()

这使用了默认参数next(),避免了每个循环的乘法开销,并使用了一个genexpr而不是一个filter()调用。我将它包装在一个函数中,因为本地人的阅读速度比全局人快。让我知道这是否更快。


推荐阅读