编辑:第一部分无效(见下面的注释)
你做过这样的尝试吗:rows = [None] * 1446311
for i in range( 1446311 ):
rows[i] = csvReader.next()
因为根据我在代码中看到的,您将数据复制两次:一次是用row = ...从文件复制到内存,一次是从row复制到{}。因为这里有不可变的东西(字符串),所以我们实际上讨论的是数据的副本,而不是引用的副本。在
此外,即使您之前创建了一个空列表,也会将大量数据放入其中;因为您只在开始处放入None,因此没有保留实际的内存空间。所以也许你可以直接写一个非常简单的东西,比如:
^{pr2}$
或者直接使用生成器语法!在rows = list(csvReader)
编辑
读完加雷斯的回答后,我对我的建议做了一些时间测试。顺便说一句,在从迭代器读取数据时要注意设置一些保护措施,以便在迭代器比预期短的情况下很好地停止:>>> from timeit import Timer
>>> import csv
>>> # building some timing framework:
>>> def test(n):
return min(Timer('test%d(F, N)' % t,
'from __main__ import test%d, F, N' % t)
.repeat(repeat=10, number=1))
>>> F = r"some\big\csvfile.csv"
>>> N = 200000
>>> def test1(file_in, number_of_lines):
csvReader = csv.reader(open(file_in, 'rb'))
rows = [None] * number_of_lines
for i, c in enumerate(csvReader): # using iterator syntax
if i > number_of_lines: # and limiting the number of lines
break
row = c
rows[i] = row
return rows
>>> test(1)
0.31833305864660133
>>> def test2(file_in, number_of_lines):
csvReader = csv.reader(open(file_in, 'rb'))
rows = [None] * number_of_lines
for i, c in enumerate(csvReader):
if i > number_of_lines:
break
row = c
return rows
>>> test(2)
0.25134269758603978 # remember that only last line is stored!
>>> def test3(file_in, number_of_lines):
csvReader = csv.reader(open(file_in, 'rb'))
rows = [None] * number_of_lines
for i, c in enumerate(csvReader):
if i > number_of_lines:
break
rows[i] = c
return rows
>>> test(3)
0.30860502255637812
>>> def test4(file_in, number_of_lines):
csvReader = csv.reader(open(file_in, 'rb'))
rows = []
for i, c in enumerate(csvReader):
if i > number_of_lines:
break
rows.append(c)
return rows
>>> test(4)
0.32001576256431008
>>> def test5(file_in, number_of_lines):
csvReader = csv.reader(open(file_in, 'rb'))
rows = list(csvReader)
# problem: there's no way to limit the number of lines to parse!
return rows
>>> test(5)
0.30347613834584308
我们可以看到,如果N大于文档中的行数,那么在计时上没有太大差别。test2在我的机器上,毫无疑问只有一点点不同。test5更优雅,但不能限制解析的行数,这可能很烦人。在
因此,如果您一次需要所有的行,我的建议是使用最优雅的解决方案,即使稍微长一点:test4。但也许,正如加雷斯所说,你不需要一下子得到所有东西,这是获得速度和记忆力的最佳途径。在