python - 我如何优化我的代码,它适用于很多数字?
问题描述
我写了以下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]]
解决方案
推荐阅读
- spring - 如何在没有spring-boot的spring项目中实现kafka模板
- java - 当更改 URL 获取 JsonMappingException:由于输入结束,没有要映射的内容
- excel - 将至少具有某些值的单元格分组
- python - 我将如何制作一个可以在 Python 中存储用户输入的字典?
- c# - 通过 c# .net 更新 excel 值,允许 excel 计算值
- assembly - GCC ARM 乘法优化
- unity3d - 如何使用着色器裁剪 WebcamTexture?
- ruby-on-rails - 允许访问子域上的一个页面,如果尝试访问其他页面重定向到主域
- google-cloud-platform - Google Cloud Storage 存储桶抛出错误“要计费的项目与已关闭的计费帐户相关联。”
- python - 如何在Python中的两个字符串之间拆分每个单独的值