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

ASG*_*SGM 4 python csv

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

如果我运行以下脚本大约需要11-12秒. b几乎立即创建a.

r = csv.reader(open("data.csv", "rb"), delimiter=";")
a = [None for row in r]
b = [row for row in r]
Run Code Online (Sandbox Code Playgroud)

但是,如果我运行一个根本不创建的类似脚本a,则代码需要更长时间(21-22秒):

r = csv.reader(open("data.csv", "rb"), delimiter=";")
b = [row for row in r]
Run Code Online (Sandbox Code Playgroud)

我可以理解为什么在创建之后b几乎没有时间a创建.但我会(天真地)想到第二个代码块,其中只b创建而不是a,将是更快的脚本.冒着出现非Pythonic的风险,我很想知道是否有人可以解释为什么创建a,然后b几乎是b单独创建的两倍.

此外,如果这种速度提升在更复杂的操作中是一致的,那么有充分的理由(除了样式/可读性问题)利用它吗?更精明的Python程序员比我已经从未听说过的传统方法节省了相同的时间吗?

如果我构造a使用整数而不是整数None,我会得到相同的结果.如果不是遍历一个csv.reader对象我遍历open("data.csv", "rb").readlines(),时机,我希望它是:创建b单独的工作比快ab.因此,时间差异可能与csv.reader对象的属性或类似对象的更一般类别的属性有关.如果我b之前创建a,时间与我b单独创建的时间大致相同.

一些说明:

  • b之前创建a需要与b单独创建相同的时间.
  • 我没有在交互模式下逐行运行这些.我将每个作为单独的脚本运行.
  • 我并没有真正尝试创建一个列表,其中包含长度相同r的列表,或者列表中的行列表r.
  • 如果重要的话,我在64位Windows 7上使用Enthought Python发行版7.3-2运行Python 2.7.3.

Tim*_*ker 6

b在第一个例子中看过了吗?它是空的,因为r第一个列表理解已经耗尽了.所有行都已经过迭代,并且 - 正如@soulcheck指出的那样 - 创建一个None包含400万个列表的列表的速度比包含400万个子列表的列表要快得多.