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