我试图理解为什么numpy.loadtxt
在函数中使用和独立使用时我会得到非常不同的分析/计时数字。
设置要读取/配置文件的数据
- 1个26列1000行的文件,文件中的每一项都是随机浮点数
- 文件是空格分隔的
- 文件中的第一行是一个空格分隔的标题,有 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='')