如何在Python中以更好的方式编写此代码?

时间:2019-06-27 12:50:17

标签: python python-3.x performance

我正在尝试编写一个具有数据LP的函数,并根据LP的值,会有一些输出。

using (var writer = new System.IO.StreamWriter(journalsCsvSFD.OpenFile()))
using (var csv = new CsvHelper.CsvWriter(writer))
{
    csv.Configuration.TypeConverterOptionsCache.GetOptions<DateTime>().Formats = new[] { "dd/MM/yyyy" };
    csv.WriteRecords(records);
}

3 个答案:

答案 0 :(得分:2)

如果您真的想要它的循环版本,由于索引不一致,需要一些技巧:

def data(lp,matrix):
    splits = [20, 30, 40, 65, 80]
    indices = [(0,0), (1,2), (3,3), (4,4), (5,5), (6,6)]
    for split, (id1, id2) in zip(splits, indices):
        if lp < split:
            return lp*matrix.t1[id1] + matrix.t2[id2]
    return lp*matrix.t1[indices[-1][0]] + matrix.t2[indices[-1][1]]

但是,老实说,我只是将其展开,我认为它更易于阅读。

def data(lp,matrix):
    if lp<20:
        return lp*matrix.t1[0] + matrix.t2[0]

    elif lp<30:
        return lp*matrix.t1[1] + matrix.t2[2]

    elif lp<50:
        return lp*matrix.t1[3] + matrix.t2[3]

    elif lp<65:
        return lp*matrix.t1[4] + matrix.t2[4]

    elif lp<80:
        return lp*matrix.t1[5] + matrix.t2[5]

    else:
        return lp*matrix.t1[6] + matrix.t2[6]

答案 1 :(得分:1)

您为什么不将所有内容循环?对我来说似乎更干净。

bounds = [20,30,50,65,80]
n = len(bounds)
for i, bound in enumerate(bounds):
    if lp < bound:
        return lp*matrix.t1[i] + matrix.t2[i]
return lp * matrix.t1[n] + matrix.t2[n]

编辑: 所以我有点盲目,没有看到索引没有循环。您仍然可以选择这样的解决方案,只需保留索引列表

bounds = [20,30,50,65,80]
idxs = [(0,0), (1,2), (3,3), (4,4), (5,5), (6,6)]
for i,bound in enumerate(bounds):
    if lp<bound:
        return lp*matrix.t1[idxs[i][0]] + matrix.t2[idxs[i][1]]
return lp*matrix.t1[idxs[-1][0]] + matrix.t2[idxs[-1][1]]

如果您有更多的案例,这可能会很有用。否则,出于简单性原因,我可能只会选择其他答案。

答案 2 :(得分:0)

您可以使用bisect,并具有更高效的比较逻辑的优点:

from bisect import bisect_left
def data(lp,matrix):
    control = [     20,    30,    50,    65,    80     ]
    indexes = [(0,0), (1,2), (3,3), (4,4), (5,5), (6,6)]
    c       = bisect_left(lp,control)
    i,j     = indexes[c]
    return lp*matrix.t1[i] + matrix.t2[j]