我如何优化可处理大量数字的代码?

时间:2020-05-22 21:58:56

标签: python optimization

我编写了以下python函数:

def ritornaoccorenzeinlista(listainput, listaricercati, rangeiniziale, rangefinale, condizionenormale):
listarisultato = []

for y in range(len(listainput)):
    contatore = 0
    for x in range(len(listaricercati)):
        if listaricercati[x] in listainput[y]:
            contatore += 1

    if rangeiniziale <= contatore <= rangefinale and condizionenormale:
        listarisultato.append(listainput[y])
    if (contatore < rangeiniziale or contatore > rangefinale) and (not condizionenormale):
        listarisultato.append(listainput[y])

return listarisultato

该函数具有以下参数:

ritornaoccorenzeinlista(list listainput[[]], list listaricercati[], int rangeiniziale, int rangefinale, bool condizionenormale)

我做了一些基准测试:

-------------1----------------
len(listainput)=252
len(listaricercati)=900000
rangeiniziale=85000
rangefinale=100000
condizionenormale= True
ExecutionTime= 38.512633323669434 seconds
-------------2----------------
len(listainput)=252
len(listaricercati)=900000
rangeiniziale=85000
rangefinale=100000
condizionenormale= False
ExecutionTime= 37.751357555389404 seconds

由于我要处理的数字很多,所以我希望使该功能尽可能快。

您有什么建议可以申请吗?

谢谢。

编辑更新: 1)添加计数器:

def ritornaoccorenzeinlista(listainput, listaricercati, rangeiniziale, rangefinale, condizionenormale):
    listarisultato = []

    for y in range(len(listainput)):
        contatore = 0
        listaconcounter = Counter(listainput[y])
        for x in range(len(listaricercati)):
            if listaconcounter[listaricercati[x]]>0:
                contatore += 1

        if rangeiniziale <= contatore <= rangefinale and condizionenormale:
            listarisultato.append(listainput[y])
        if (contatore < rangeiniziale or contatore > rangefinale) and (not condizionenormale):
            listarisultato.append(listainput[y])

    return listarisultato

基准:

-------------3----------------
len(listainput)=252
len(listaricercati)=900000
rangeiniziale=85000
rangefinale=100000
condizionenormale= True
ExecutionTime= 75.9251697063446 seconds

编辑更新: 2)以更好的方式添加计数器:

def ritornaoccorenzeinlista(listainput, listaricercati, rangeiniziale, rangefinale, condizionenormale):
    listarisultato = []
    listaricercati=Counter(listaricercati).most_common()
    for y in range(len(listainput)):
        contatore = 0
        for x in range(len(listaricercati)):
            if listaricercati[x][0] in listainput[y]:
                contatore += 1*listaricercati[x][1]

        if rangeiniziale <= contatore <= rangefinale and condizionenormale:
            listarisultato.append(listainput[y])
        if (contatore < rangeiniziale or contatore > rangefinale) and (not condizionenormale):
            listarisultato.append(listainput[y])

    return listarisultato

基准:

-------------1----------------
len(listainput)=252
len(listaricercati)=900000
rangeiniziale=85000
rangefinale=100000
condizionenormale= True
ExecutionTime= 0.059412479400634766 seconds

编辑更新: 3)翻译函数并添加一些输出作为示例:

inputlist=[[1,2,3,4,5],[6,7,8,9,10]]
#each inputlist[x] contain different numbers
listnumbertofind=[1,2,2,3,6,11,1,7,1]
#listnumbertofind could contain repeated numbers
startrange=2
finishrange=4
boolean=True
#boolean can be True or False based on how the function get called
#the function should return the elements of inputlist[] that contains 2<listnumbertofind[x]<4


def ritornaoccorenzeinlista(inputlist, listnumbertofind, startrange, finishrange, boolean):
    listarisultato = []
    listnumbertofind=Counter(listnumbertofind).most_common()
    for y in range(len(inputlist)):
        contatore = 0
        for x in range(len(listnumbertofind)):
            if listnumbertofind[x][0] in inputlist[y]:
                contatore += 1*listnumbertofind[x][1]

        if startrange <= contatore <= finishrange and boolean:
            listarisultato.append(inputlist[y])
        if (contatore < startrange or contatore > finishrange) and (not boolean):
            listarisultato.append(inputlist[y])

    return listarisultato

示例输出使用报告的值:

[[6, 7, 8, 9, 10]]

0 个答案:

没有答案