csv
我正在使用Python中的无价模块读取一个大型 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]
但是,如果我运行一个根本不创建的类似脚本,a
则代码需要更长的时间(21-22 秒):
r = csv.reader(open("data.csv", "rb"), delimiter=";")
b = [row for row in r]
我可以理解为什么在创建之后b
几乎不需要任何时间a
。但我会(天真地)认为,第二个代码块,其中 onlyb
是 created 而不是a
,将是更快的脚本。冒着出现非 Pythonic 的风险,我很想知道是否有人可以解释为什么创建a
然后几乎是单独b
创建的两倍。b
此外,如果这种速度提升在更复杂的操作中是一致的,是否有充分的理由(除了样式/可读性问题)不利用它?比我更精明的 Python 程序员是否已经使用我从未听说过的一些传统方法节省了相同的时间?
如果我a
使用整数而不是构造None
,我会得到相同的结果。如果不是迭代csv.reader
我迭代的对象open("data.csv", "rb").readlines()
,那么时间就像我期望的那样:b
单独创建比创建a
then更快b
。因此,时间差异可能与csv.reader
对象的属性或类似它的更一般类的对象的属性有关。如果我b
在之前创建,则时间与我单独 a
创建的时间大致相同。b
一些注意事项:
b
在此之前创建与单独创建a
所需的时间相同。b
- 我没有在交互模式下逐行运行这些。我将每个都作为单独的脚本运行。
- 我并没有真正尝试创建一个列表,其中包含与 相同长度
r
的列表,或者r
. - 万一这很重要,我正在 64 位 Windows 7 上使用 Enthought Python 发行版 7.3-2 运行 Python 2.7.3。