2017-02-23 19 views
1

ソースコードベースを広範にプロファイリングした結果、いくつかの巨大なリストをループしている間にすべてのパフォーマンスの問題が発生することがわかりました。次のような問題を引き起こしているさまざまなシナリオでループを反復処理する最速の方法

コード通路を識別することができます

#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の専門家は、私たちの素晴らしいパフォーマンスの向上につながる4ワンライナーを書き留めることができることをかなり確信しています応用。しかし、私が気付いていないnumpyよりも、おそらくループ処理の方が良い方法かもしれません。

トピックに関するご意見をお待ちしております。

+0

これらはすべてリストに対応しています。なぜ愚痴な質問ですか?配列の場合は、より高速なコンパイル済み操作を提案するかもしれません。しかし、そのためには、形状やdtypeのようなものを知る必要があります。 – hpaulj

+0

こんにちは。すべてのリスト要素のデータ型は常にfloatであり、リストはフラットです(リストのリストはありません)。 – Rickson

+0

numpyコンテキストの詳細については、http://stackoverflow.com/q/42356625を参照してください。 – hpaulj

答えて

2

まず問題:あなたはすでにリストに繰り返し処理を行う場合、なぜnindexを計算:代わりにlist

anotherSet = set(anotherList) 
myList = [i for j, i in enumerate(myList) if j not in anotherSet] 

第二の問題のset内のルックアップをしますか?問題3 & 4についてenumerate

TargetIndex = next((i for i,n in enumerate(myList) if n > someBoundary), len(myList)) 

使用し、非常にあなたがいますが、同じリストに二回、それを実行しないように、絶対値のリストを事前に計算することができませんがあります。

abs_vals = [abs(n) for n in myList] 

はとても例えば第四スニペットは次のようになります。

for index,av in enumerate(abs_vals): 
    if av < someLimit: 
     myList[index] = 0 
+0

Wow。それは速かった。どうもありがとう。私はそれを試してみる。 – Rickson

+0

うまくいった。ありがとう! – Rickson

2

警告として、あなたがnumpyの配列としてデータを保存したい場合は、これらよりも多くを変更する必要がありますが、このよあなたが持っている問題をどのように修正するかです。

import numpy as np 

myArr=np.array(myList) 

#1 
myArr = myArr[np.in1d(np.arange(myArr.size), anotherList, invert = True)] 

#2 
TargetIndex = next(np.nonzero(myArr > someBoundary)[0].flat, myArr.size) 

#3 
def myFunction(): 
    return (np.abs(myArr) <= someLimit).astype(int) 

#4 
np.where(np.abs(myArr) < someLimit, 0, myArr) 
関連する問題