0

在 python 2.7.3 中迭代列表列表时,我注意到更改迭代顺序时的性能差异:

我有一个包含 500000 个字符串的 200 个列表。然后我以以下方式迭代:

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

现在我希望对列表进行有效的随机访问。这 4 秒是从哪里来的;它只是缓存吗?

4

1 回答 1

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因此(大约)与变体所示的时间差相同。

于 2013-04-17T08:32:23.553 回答