在各种场景中迭代循环的最快方法

时间:2017-02-23 10:08:32

标签: python arrays performance python-2.7 numpy

在对我们的源代码库进行大量分析之后,我们发现在循环访问一些巨大的列表时会导致所有性能问题。

导致问题的代码段落可以识别如下:

#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循环操作。

对此主题的任何建议都非常感谢。

2 个答案:

答案 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