【发布时间】:2016-02-13 01:34:43
【问题描述】:
我测试了一些代码以了解哪个有效,返回迭代器并返回整个列表。
该程序是关于读取.txt文件的所有行(非常大)并创建字数统计字典(Python3.4)。
1.返回迭代器
from collections import defaultdict
import time
def create_word_cnt_dict(line_iter):
doc_vector = defaultdict(int)
for line in line_iter:
for word in line.split():
doc_vector[word] += 1
return dict(doc_vector)
def read_doc(doc_file):
with open(doc_file) as f :
while True:
line = f.readline()
if not line:
break
yield line
t0 = time.time()
line_iter = read_doc("./doc1.txt")
doc_vector = create_word_cnt_dict(line_iter)
t1 = time.time()
print(t1-t0)
需要,3.765739917755127
2.返回整个列表
from collections import defaultdict
import time
def create_word_cnt_dict(line_list):
doc_vector = defaultdict(int)
for line in line_list:
for word in line.split():
doc_vector[word] += 1
return dict(doc_vector)
def read_doc1(doc_file):
with open(doc_file) as f :
lines = f.readlines()
return lines
t0 = time.time()
lines = read_doc1("./doc1.txt")
doc_vector = create_word_cnt_dict(lines)
t1 = time.time()
print(t1-t0)
需要,3.6890149116516113
如您所见,返回整个列表要快得多。
但是在内存使用方面,返回迭代器比返回整个列表更有效。
在书Effective Python 中,它建议返回迭代器以提高内存使用效率。但我认为现在时间复杂度比空间复杂度更重要,因为今天的计算机有足够的内存。
请给我一些建议。
【问题讨论】:
-
取决于你有多少内存。如果您正在使用带有 1M 加行的列表/文件,则迭代器是要走的路。对于普通的家庭编码,我通常只吸收整个文件。
-
请记住,对于这段代码,使用Counter 对象可能更有意义。
-
这里没有具体问题,只是请求讨论。
-
@Kupiakos 感谢您的建议:)
标签: python performance time-complexity space-complexity