5

次のpythonコードを高速化しようとしています:

for j in range(4,len(var_s),3):
    mag_list.append(float(var_s[j]))
mag_list = [value for value in mag_list if value != 99.]
med_mag = np.median(mag_list)

2 つの for ループを 1 つに結合する良い方法はありますか? このように、それは本当に遅いです。必要なのは、そのエントリの値が 99 に等しくない場合、var_s リストから 3 つおきのエントリを 5 つ目から抽出することです。結果のリストの中央値が必要です。ありがとう!

4

3 に答える 3

12

あなたはおそらく試すことができます:

mag_list = [value for value in var_s[4::3] if value != 99.]

によってはvar_s、 を使用したほうがよい場合もありますがitertools.islice(var_s,4,None,3)、それを知るにはタイミングが必要です。

おそらく、ずっと numpy に固執していれば、さらにうまくいくでしょう:

vs = np.array(var_s[4::3],dtype=np.float64)  #could slice after array conversion too ...
med_mag = np.median(vs[vs!=99.])

繰り返しますが、これは、他のものと比較してどのように実行されたかを確認するために時間を計る必要があります.

于 2013-04-09T14:13:43.390 に答える
4
mag_list = filter(lambda x: x != 99, var_s[4::3])

わかりましたので、ここにいくつかのtimeit試行を示します。すべて Python 2.7.2 で行います。

セットアップ:

>>> from random import seed, random
>>> from timeit import Timer
>>> from itertools import islice, ifilter, imap
>>> seed(1234); var_s = [random() for _ in range(100)]

for ループの使用:

>>> def using_for_loop():
...     mag_list = []
...     for j in xrange(4, len(var_s), 3):
...             value = float(var_s[j])
...             if value != 99: mag_list.append(value)
... 
>>> Timer(using_for_loop).timeit()
11.596584796905518

マップとフィルターの使用:

>>> def using_map_filter():
...     map(float, filter(lambda x: x != 99, var_s[4::3]))
... 
>>> Timer(using_map_filter).timeit()
8.643505096435547

islice、imap、ifilter の使用:

>>> def using_itertools():
...     list(imap(float, ifilter(lambda x: x != 99, islice(var_s, 4, None, 3)))) 
... 
>>> Timer(using_itertools).timeit()
11.311019897460938

リスト内包表記と islice の使用:

>>> def using_list_comp():
...     [float(v) for v in islice(var_s, 4, None, 3) if v != 99]
... 
>>> Timer(using_list_comp).timeit()
8.52650499343872
>>> 

結論として、islice でリスト内包表記を使用するのが最も速く、次に map と filter の使用がわずかに遅くなります。

于 2013-04-09T14:15:26.193 に答える
1
for j in range(4,len(var_s),3):
    value = float(var_s[j])
    if value != 99:
        mag_list.append(value)
med_mag = np.median(mag_list)
于 2013-04-09T14:13:27.790 に答える