【发布时间】:2015-10-01 02:42:30
【问题描述】:
我有一个列表列表,其中包含 200 万个元素,每个元素有 7 个条目。
我对数据运行机器学习算法,并希望将分类结果附加到每个元素的末尾。
我使用.append() 功能,类似于
for j in range(len(data)):
data[j].append(results[j])
但是,这需要很长时间(8 多个小时,但仍未终止)。
我想知道是否有更有效的方法来做到这一点。数据是从 CSV 文件中读取的,所以也许我可以将结果直接写入 CSV?
我在考虑使用 numpy 数组,但我记得有人说列表更快。
有人有什么想法吗?
编辑:这是我的代码
import csv
with open("measles_data_b", 'r') as f:
reader = csv.reader(f)
t = list(reader)
### Perform the machine Learning. That bit works fine.
#At this point, t is a list with size=1971203, and each element in t has 7 elements of its own
# results is a list with the same number of elements. Its entries are
# one of three things: '1','2','0'.
for j in range(len(t)):
t[j].append(results[j])
【问题讨论】:
-
您是否考虑过以 8 个条目开始创建每个元素,因此您可以直接使用
data[j][7] = results[j],从而避免调整每个列表的大小? -
您可以分析您的代码,并计算从 CSV 读取所花费的时间、追加所花费的时间以及回写 CSV 所花费的时间。
-
您确定只是这个
append循环需要8 个多小时吗?我刚刚运行了您发布的带有 200 万个元素列表的循环,它花了两秒钟或类似的时间。这正是我所期望的,附加很便宜,非常便宜。我很难相信这段时间没有花在代码的其余部分上。 -
请仔细检查。如果这是您的全部代码,我以三比一打赌它不会挂起,因为附加循环需要很长时间。 (有一个garbage collection bug in old Python versions that would cause list.append to be extremely slow,但对于 200 万个元素来说还远远没有花费 小时。我什至不确定它是否适用于这里,因为实际的附加发生在 7 元素列表上。)
-
我使用列表推导通过将 200 万个随机生成的元素的列表附加到 200 万个随机生成的列表的末尾来加入。生成所有随机数的列表大约需要 15 秒。评估列表理解花费了不到一秒钟的时间。我同意其他人的观点,这里发生了其他事情,而 append 不是罪魁祸首。