133

私は timeit をいじっていて、小さな文字列に対して単純なリスト内包表記を実行すると、小さな単一文字列のリストに対して同じ操作を実行するよりも時間がかかることに気付きました。説明はありますか?約1.35倍の時間です。

>>> from timeit import timeit
>>> timeit("[x for x in 'abc']")
2.0691067844831528
>>> timeit("[x for x in ['a', 'b', 'c']]")
1.5286479570345861

これを引き起こしている下位レベルで何が起こっているのでしょうか?

4

3 に答える 3

33

ほとんどのコンテナー オブジェクト (リスト、タプル、辞書など) を反復処理する場合、イテレーターはコンテナー内のオブジェクトを配信します

ただし、文字列を反復処理する場合、配信される文字ごとに新しいオブジェクトを作成する必要があります。リストがコンテナーであるのと同じ意味で、文字列は「コンテナー」ではありません。文字列内の個々の文字は、反復によってそれらのオブジェクトが作成されるまで、個別のオブジェクトとして存在しません。

于 2014-05-26T01:16:49.637 に答える
1

文字列の反復子を作成するためにオーバーヘッドが発生する可能性があります。一方、配列には、インスタンス化時にイテレータが既に含まれています。

編集:

>>> timeit("[x for x in ['a','b','c']]")
0.3818681240081787
>>> timeit("[x for x in 'abc']")
0.3732869625091553

これは 2.7 を使用して実行されましたが、私の mac book pro i7 で実行されました。これは、システム構成の違いが原因である可能性があります。

于 2014-05-26T01:14:00.090 に答える