我正在将文件的每一行读入列表和字典,
with open("../data/title/pruned2_titleonly.txt", 'rb') as f_titles:
titles_lst = f_titles.read().split('\n')
assert titles_lst[-1] == ''
titles_lst.pop() # remove the last element, an empty string
titles_dict = {}
with open("../data/title/pruned2_titleonly.txt", 'rb') as f_titles:
for i,line in enumerate(f_titles):
titles_dict[i] = line
我正在通过以随机顺序访问列表/字典中的每个项目来测试性能:
n = len(titles_lst)
a = np.random.permutation(n)
%%time
for i in xrange(10):
t = []
for b in a:
t.append(titles_lst[b])
del t
>>> CPU times: user 18.2 s, sys: 60 ms, total: 18.2 s
>>> Wall time: 18.1 s
%%time
for i in xrange(10):
t = []
for b in a:
t.append(titles_dict[b])
del t
>>> CPU times: user 41 s, sys: 208 ms, total: 41.2 s
>>> Wall time: 40.9 s
上述结果似乎暗示字典不如查找表的列表高效,即使列表查找是 O(n) 而字典查找是 O(1)。我已经测试了以下内容,看看 O(n)/O(1) 的性能是否属实......结果不是......
%timeit titles_lst[n/2]
>>> 10000000 loops, best of 3: 81 ns per loop
%timeit titles_dict[n/2]
>>> 10000000 loops, best of 3: 120 ns per loop
什么是交易?如果需要注意的话,我在 Ubuntu 12.04 下使用 Python 2.7.6 Anaconda 发行版,并且在 Intel MKL 下构建了 NumPy。