在对我们的源代码库进行大量分析之后,我们发现在循环访问一些巨大的列表时会导致所有性能问题。
导致问题的代码段落可以识别如下:
#ISSUE 1
myList = [i for j, i in enumerate(myList) if j not in anotherList]
#ISSUE 2
TargetIndex = next((myList.index(n) for n in myList if n > someBoundary), len(myList))
#ISSUE 3
def myFunction():
for i in myList:
if abs(i) > someLimit:
return 0
return 1
#ISSUE 4
for n,i in enumerate(myList):
if abs(i) < someLimit:
myList[n] = 0
我很确定一些numpy
专家可以写下四个单行,这将导致我们的应用程序的性能提升。但也许甚至可能有更好的方法来进行那些我不知道的numpy
循环操作。
对此主题的任何建议都非常感谢。
答案 0 :(得分:2)
第一个问题:在set
而不是list
anotherSet = set(anotherList)
myList = [i for j, i in enumerate(myList) if j not in anotherSet]
第二个问题:为什么在已经迭代列表时计算index
n
?使用enumerate
TargetIndex = next((i for i,n in enumerate(myList) if n > someBoundary), len(myList))
问题3&amp; 4,除了预先计算绝对值列表之外没有太多可以做的事情,所以你不要在同一个列表上执行两次。
abs_vals = [abs(n) for n in myList]
所以例如第4个片段变为:
for index,av in enumerate(abs_vals):
if av < someLimit:
myList[index] = 0
答案 1 :(得分:2)
作为警告,如果您想将数据保持为numpy数组,则必须进行更改,但这就是您解决问题的方法。
location