numpy.loadtxt
関数内で使用する場合とスタンドアロンで使用する場合で、プロファイル/タイミングの数値が大きく異なる理由を理解しようとしています。
読み取り/プロファイルするデータの設定
- 26 列 1000 行の 1 つのファイル。ファイル内の各項目はランダムな浮動小数点数です。
- ファイルはスペースで区切られています
- ファイルの 1 行目は、26 列の名前を持つスペース区切りのヘッダーです
- このデータの生成方法に関するコードについては、以下を参照してください
numpy.loadtxt のみのプロファイリング
上記のプロパティを持つ「test.out」というファイルがあるとします。
>>> f = open('test.out', 'r');f.readline()
'a b c d e f g h i j k l m n o p q r s t u v w x y z\n'
>>> %timeit -n 1 np.loadtxt(f, unpack=True)
1 loops, best of 3: 30 us per loop
関数内の numpy.loadtxt のプロファイリング
ここnumpy.loadtxt
で、関数内で (line_profiler を使用して)プロファイルを作成%lrpun
し、ipython で魔法を使用します。
>>> %lprun -f file_to_numpy_ordered_dict file_to_numpy_ordered_dict('test.out')
Timer unit: 1e-06 s
Function: file_to_numpy_ordered_dict at line 88
Total time: 0.085642 s
Line # Hits Time Per Hit % Time Line Contents
==============================================================
88 def file_to_numpy_ordered_dict(filename):
89 """
90 Read a space-separated-value file as a dict of columns, keyed by
91 column header where each column (dict value) is a numpy array.
92 """
93
94 1 430 430.0 0.5 with open(filename, 'r') as file_obj:
95 1 363 363.0 0.4 headers = file_obj.readline().split()
96
97 # unpack=True b/c want data organized as column based arrays, not rows
98 1 84634 84634.0 98.8 arrs = np.loadtxt(file_obj, unpack=True)
99
100 1 66 66.0 0.1 ret_dict = collections.OrderedDict()
101 27 34 1.3 0.0 for ii, colname in enumerate(headers):
102 26 114 4.4 0.1 ret_dict[colname] = arrs[ii]
103
104 1 1 1.0 0.0 return ret_dict
なんで?
numpy.loadtxt を単独で呼び出すのに 30us しかかからず、この関数内で呼び出すと約 0.085 秒かかるのはなぜですか? ここに欠けている明らかなものがあるように感じますが、各シナリオで同じ引数などを使用して関数がまったく同じように呼び出されているようです。
%timeit
と を使用しているため、これは奇妙な違い%lprun
ですか? このデータは何らかの理由で比較できないのでしょうか?
ランダムデータ作成の詳細
ファイル データは次のコードで生成されました: def generate_test_data(column_names, row_count, filename): """ サイズ (row_count, len(column_names)) のランダム テスト データのファイルを生成します
column_names - List of column name strings to use as header row row_count - Number of rows of data to generate filename - Name of file to write test data to """ col_count = len(column_names) rand_arr = np.random.rand(row_count, col_count) header_line = ' '.join(column_names) np.savetxt(filename, rand_arr, delimiter=' ', fmt='%1.5f', header=header_line, comments='')