【问题标题】:How can I append data to a list of lists efficiently?如何有效地将数据附加到列表列表中?
【发布时间】: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 不是罪魁祸首。

标签: python list csv


【解决方案1】:

作为实验,运行以下代码:

import random

def append_items(lists, items):
    for i in range(len(lists)):
        lists[i].append(items[i])

rand_lists = [[random.randint(0,9) for i in range(7)] for j in range(2000000)]
rand_list = [random.randint(0,9) for i in range(2000000)]

print("Lists generated")
append_items(rand_lists,rand_list)
print("Lists appended")

当我运行它时,我需要等待 20-30 秒才能看到“生成的列表”打印出来,但下一次打印几乎是瞬间完成的。如果你没有得到这种行为,那么你就有一个错误的 Python 安装。如果不是——很难说发生了什么。看看type(t[0]) 可能会很有趣,也许你有一个类似列表的对象的列表而不是一个列表的列表,并且你的类似列表的对象实现了一个低效的附加方法(我还没有使用它,但至少看起来可能 csv.reader 返回某种自定义对象)。

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 2020-09-05
    • 2022-01-17
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多