我正在使用无价的 csv
读取一个大型 csv 文件(超过 400 万行) Python 中的模块。在对各种方法进行计时时,我遇到了一个不直观的结果。
如果我运行以下脚本,它大约需要 11-12 秒。 b
在 a
之后几乎立即创建.
r = csv.reader(open("data.csv", "rb"), delimiter=";")
a = [None for row in r]
b = [row for row in r]
但是如果我运行一个类似的脚本,它不会创建 a
总之,代码花费的时间更长(21-22 秒):
r = csv.reader(open("data.csv", "rb"), delimiter=";")
b = [row for row in r]
我能理解为什么要创建 b
a
之后几乎不需要时间已经创建。但我会(天真地)认为第二个代码块,其中只有 b
被创建而不是 a
, 将是更快的脚本。冒着非 Pythonic 的风险,我很想知道是否有人可以解释为什么创建 a
然后 b
几乎是创建 b
的两倍一个人。
此外,如果这种速度提升在更复杂的操作中是一致的,是否有充分的理由(除了样式/可读性问题)不利用它?比我更精明的 Python 程序员是否已经使用一些我从未听说过的传统方法实现了同样的时间节省?
如果我构造 a
使用,比方说,一个整数而不是 None
,我得到相同的结果。如果不是遍历 csv.reader
我迭代的对象 open("data.csv", "rb").readlines()
, 时机如我所料:创建 b
单独比创建要快 a
然后b
.所以时间差异可能与 csv.reader
的属性有关对象,或类似它的更一般类的对象。如果我创建 b
在 a
之前, 时间和我创建的时间差不多一样 b
独自的。
一些注意事项:
- 正在创建
b
在a
之前与创建b
的时间相同一个人。 - 我没有在交互模式下逐行运行这些。我将每个作为单独的脚本运行。
- 我并不是真的想创建一个长度与
r
相同的列表,或r
中的行列表. - 以防万一,我在 64 位 Windows 7 上运行 Python 2.7.3,使用 Enthought Python 发行版 7.3-2。
最佳答案
你在你的第一个例子中看过 b
了吗?它是空的,因为 r
已被第一个列表理解耗尽。所有的行都已经被迭代了,而且——正如@soulcheck 所指出的——创建一个包含 400 万个 None
的列表比创建一个包含 400 万个子列表的列表要快得多。
关于python - 使用 python csv 模块,为什么创建相同值的列表会加快创建行列表的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15855901/