您的当前位置:首页正文

python性能到底有多差_List在python中的性能很差吗?

2024-12-01 来源:个人技术集锦

编辑:第一部分无效(见下面的注释)

你做过这样的尝试吗: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。但也许,正如加雷斯所说,你不需要一下子得到所有东西,这是获得速度和记忆力的最佳途径。在

显示全文