首页 > 解决方案 > 我如何优化我的代码,它适用于很多数字?

问题描述

我写了以下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]]

标签: pythonoptimization

解决方案


推荐阅读