在循环中将数据写入 CSV Python

Writing data into a CSV within a loop Python

我目前正在参加 Dstl 卫星 kaggle 挑战赛。我需要创建一个 csv 格式的提交文件。 csv 中的每一行包含:

Image ID, polygon class (1-10), Polygons

多边形是一个很长的条目,有开始、结束和开始等。

多边形是使用一种算法创建的,一次创建一个 class,一次创建一张图片(429 张图片,每张 10 classes)。

现在我的问题与计算时间和最佳实践有关:如何最好地将我创建的多边形数据写入 csv?我是否在开始时打开 csv,然后在遍历 classes 和图像时将每一行写入文件?

或者我应该将数据保存在列表或字典或其他东西中,然后立即将整个内容写入 csv 文件?

问题是,我不确定写入 csv 文件的速度有多快。此外,由于该算法在计算上已经相当耗时,我想省去我的电脑将所有数据保存在 RAM 中的麻烦。

而且我想立即将数据写入 csv 会导致使用更少的 RAM,对吧?

所以你说光盘运行很慢。这到底是什么意思呢?当我在创建数据时将每一行写入 csv 时,这会减慢我的程序吗?因此,如果我将整个列表写入一个 csv 文件,这比写一行要快,然后再次计算一个新的数据行?那么这意味着,计算机会等待一个动作完成,然后才能开始下一个动作,对吗?但是话又说回来,如果我等待整个数据积累起来,是什么让这个过程更快?无论如何,必须将相同数量的行写入csv,为什么我逐行写入会更慢?

How do I best write the data of the polygons that I create into the csv? Do I open the csv at the beginning and then write each row into the file, as I iterate over classes and images?

我怀疑大多数人会将数据收集到列表或字典中,然后在最后将其全部写出。但是,如果您不需要对其进行额外的处理,是的——将其发送到磁盘并释放资源。

And I guess writing the data into the csv right away would result in less RAM used, right?

是的,会,但不会影响 CPU 使用;只是减少 RAM 使用量,尽管它确实取决于 Python GC 的时间。你真的不应该担心这样的细节。首先要获得准确的输出。

首先,使用csv库。 文档 https://docs.python.org/2/library/csv.html (py2) 或 https://docs.python.org/3/library/csv.html (py3)

现在,使用此库,您可以获取 list-like objects 列表或字典列表(其中键是 csv 的 headers )并将它们写入一份文件。这几乎可以肯定是正确的方法。如果您有足够的数据,以至于 python 过程的内存用完了,那么您可能想回头再考虑一下,但是对于 429 * 10 = 4290 行,这可能不会发生.

And I guess writing the data into the csv right away would result in less RAM used, right?

磁盘访问通常是一个相对较慢的操作,因此任何最大化磁盘访问以节省内存使用的方法都是有问题的。