7

例えば:

a = [1,2,3]
x = [2*i for i in a]
y = [3*i for i in a]

a のサイズが大きい場合、(可能であれば) リスト内包表記を 1 つに結合する方が効率的でしょうか? もしそうなら、どうやってこれをしますか?

何かのようなもの、

x,y = [2*i, 3*i for i in a]

これは機能しません。リスト内包表記を使用しても、通常の for ループを使用するよりも計算効率が良くない場合は、私にも知らせてください。ありがとう。

4

2 に答える 2

13

これを行うには、zip()ビルトインとスター演算子を使用します。zip()通常、リストをペアのリストに変換します。このように使用すると、解凍されます - ペアのリストを取得し、2 つのリストに分割します。

>>> a = [1, 2, 3]
>>> x, y = zip(*[(2*i, 3*i) for i in a])
>>> x
(2, 4, 6)
>>> y
(3, 6, 9)

これが実際に重要な意味でより効率的であるかどうかはわかりません。

于 2012-06-21T22:43:53.710 に答える
10

timeit モジュールを使用する効率について疑問がある場合は、いつでも簡単に使用できます。

import timeit

def f1(aRange):
    x = [2*i for i in aRange]
    y = [3*i for i in aRange]
    return x,y

def f2(aRange):
    x, y = zip(*[(2*i, 3*i) for i in aRange])
    return x,y

def f3(aRange):
    x, y = zip(*((2*i, 3*i) for i in aRange))
    return x,y

def f4(aRange):
    x = []
    y = []
    for i in aRange:
        x.append(i*2)
        y.append(i*3)
    return x,y

print "f1: %f" %timeit.Timer("f1(range(100))", "from __main__ import f1").timeit(100000)
print "f2: %f" %timeit.Timer("f2(range(100))", "from __main__ import f2").timeit(100000)
print "f3: %f" %timeit.Timer("f3(range(100))", "from __main__ import f3").timeit(100000)
print "f4: %f" %timeit.Timer("f4(range(100))", "from __main__ import f4").timeit(100000)

結果は、最初のオプションが最速であるという点で一貫しているようです。

f1: 2.127573
f2: 3.551838
f3: 3.859768
f4: 4.282406
于 2012-06-21T23:18:47.797 に答える