44

私の現在の仕事では、Numpy とリスト内包表記を多く使用しており、可能な限り最高のパフォーマンスを得るために、次の質問があります。

次のように Numpy 配列を作成すると、舞台裏で実際に何が起こるでしょうか?

a = numpy.array( [1,2,3,4] )

私の推測では、Python は最初に値を含む通常のリストを作成し、次にリスト サイズを使用して numpy 配列を割り当て、その後値をこの新しい配列にコピーします。これは正しいですか、それともインタプリタはリストが仲介にすぎないことを認識し、代わりに値を直接コピーするほど賢いですか?

同様に、次を使用してリスト内包表記からnumpy配列を作成したい場合numpy.fromiter()

a = numpy.fromiter( [ x for x in xrange(0,4) ], int )

これにより、にフィードされる前に値の中間リストが作成されfromiter()ますか?

4

3 に答える 3

45

あなたが探している答えよりも、 numpy.fromitergenerator expressionsを使用していると思います。

numpy.fromiter((<some_func>(x) for x in <something>),<dtype>,<size of something>)

ジェネレーター式は遅延型です。反復処理を行うときに式を評価します。

リスト内包表記を使用するとリストが作成され、それが numpy にフィードされますが、ジェネレータ式は一度に 1 つ生成されます。

Python は、ほとんどの言語 (すべてではないにしても) と同様に、内側から外側へと評価するため、 using[<something> for <something_else> in <something_different>]はリストを作成し、それを反復処理します。

于 2013-01-17T05:31:27.457 に答える
8

独自のリストを作成して実験し、状況を明らかにすることができます...

>>> class my_list(list):
...     def __init__(self, arg):
...         print 'spam'
...         super(my_list, self).__init__(arg)
...   def __len__(self):
...       print 'eggs'
...       return super(my_list, self).__len__()
... 
>>> x = my_list([0,1,2,3])
spam
>>> len(x)
eggs
4
>>> import numpy as np
>>> np.array(x)
eggs
eggs
eggs
eggs
array([0, 1, 2, 3])
>>> np.fromiter(x, int)
array([0, 1, 2, 3])
>>> np.array(my_list([0,1,2,3]))
spam
eggs
eggs
eggs
eggs
array([0, 1, 2, 3])
于 2013-01-17T05:33:21.050 に答える