2

有限シーケンスを生成するジェネレーターがあります。このシーケンスの長さを決定するために、次の 2 つの方法を試しました。

 seq_len = sum([1 for _ in euler14_seq(sv)])  # list comp

 seq_len = sum(1 for _ in euler14_seq(sv))    # generator expression

svシーケンスの定数開始値です。

リスト内包表記は遅くなり、ジェネレータ式は速くなると予想していましたが、結果は逆です。

最初のものは、最初にメモリ内に完全なリストを作成するため、メモリを大量に消費すると思います。これも、遅くなると思った理由の一部です。

私の質問:この観察は一般化できますか?これは、2 番目のステートメントと最初のステートメントに 2 つのジェネレーターが含まれているためですか?

私はこれらを見てきましたジェネレーター/イテレーターでアイテムの数を数える最短の方法は何ですか? ジェネレーター出力の長さ、および Python でイテラブルの長さを取得する組み込みの方法はありますか? シーケンスの長さを測定するための他のいくつかのアプローチを見ましたが、リストcompとジェネレーター式の比較に特に興味があります。

PS: これは、昨日 SO で尋ねられた質問に基づいてオイラー プロジェクト #14を解決することにしたときに思いつきました。

(ちなみに、'_'変数値が必要ない場所での使用に関する一般的な感覚はどうですか)。

これは、Windows 7 64 ビットの Python 2.7.2 (32 ビット) で行われました。

4

2 に答える 2

5

このコンピューターでは、ジェネレーター式は 100,000 から 1,000,000 の間のどこかで高速になります。

$ python -m timeit "sum(1 for x in xrange(100000))"
10 loops, best of 3: 34.8 msec per loop
$ python -m timeit "sum([1 for x in xrange(100000)])"
10 loops, best of 3: 20.8 msec per loop
$ python -m timeit "sum(1 for x in xrange(1000000))"
10 loops, best of 3: 315 msec per loop
$ python -m timeit "sum([1 for x in xrange(1000000)])"
10 loops, best of 3: 469 msec per loop
于 2012-07-05T23:38:37.050 に答える
3

次のコード ブロックは、長さを生成する必要があります。

>>> gen1 = (x for x in range(10))
>>> len(list(gen1))
10
于 2012-07-05T23:29:57.430 に答える