python - 使用 python csv 模块,为什么创建相同值的列表会加快创建行列表的速度?

标签 python csv

我正在使用无价的 csv 读取一个大型 csv 文件(超过 400 万行) Python 中的模块。在对各种方法进行计时时,我遇到了一个不直观的结果。

如果我运行以下脚本,它大约需要 11-12 秒ba 之后几乎立即创建.

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 的属性有关对象,或类似它的更一般类的对象。如果我创建 ba 之前, 时间和我创建的时间差不多一样 b独自的。

一些注意事项:

  • 正在创建 ba 之前与创建 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/

相关文章:

python - Django 。根据用户输入处理上传的 csv

linux - 在 Linux 中打印 CSV 文件中的一列

python - 初学python面临 'builtin_function_or_method'对象没有属性错误

python - 学习使用 Selenium 和 Python 进行抓取

python - 读取多个 csv 文件并将文件名添加为 Pandas 中的新列

mysql - 在python中执行executemany命令时获取KeyError

python - 在 pandas read_csv() 中引用参数

python - 如何以列表形式获取代码的输出?

python - 提取数字后跟单词

python - Python Tkinter OpenCV PIL图像调整大小以适合标签