我正在使用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单独的工作比快a则b.因此,时间差异可能与csv.reader对象的属性或类似对象的更一般类别的属性有关.如果我b之前创建a,时间与我b单独创建的时间大致相同.
一些说明:
b之前创建a需要与b单独创建相同的时间.r的列表,或者列表中的行列表r.你b在第一个例子中看过了吗?它是空的,因为r第一个列表理解已经耗尽了.所有行都已经过迭代,并且 - 正如@soulcheck指出的那样 - 创建一个None包含400万个列表的列表的速度比包含400万个子列表的列表要快得多.