在python 2.7.3中迭代列表列表时,我注意到在更改迭代顺序时的性能差异:
我有200个500000字符串列表的列表。然后我以下列方式进行迭代:
numberOfRows = len(columns[0])
numberOfColumns = len(columns)
t1 = time.clock()
for i in xrange(numberOfRows):
for j in xrange(numberOfColumns):
cell = columns[j][i]
print time.clock() - t1
t1 = time.clock()
for i in xrange(numberOfColumns):
for j in xrange(numberOfRows):
cell = columns[i][j]
print time.clock() - t1
该程序重复产生类似于此的输出:
33.97
29.39
现在我希望efficient random access on the lists。这4秒来自哪里;它只是缓存吗?
答案 0 :(得分:1)
我得到像
这样的东西30.509407822896037
29.88344778700383
代表
columns = [[0] * 500000 for x in range(200)]
如果我用cell = ...
替换pass
行,我会
8.44722739915369
10.23647023463866
所以创建xrange
对象或类似的东西绝对不是问题。
这是列的缓存(不是由Python,通过计算机):如果我使用
columns = [[0] * 500000] * 200
我得到了
27.725353873145195
29.592749434295797
这里,始终使用相同的列对象,并且(几乎)缓存没有区别。因此(约)与pass
变体中的时间差异相同。