嘿所有, 我有一些代码来读取文件中的某些行,并想知道它是否会作为列表推导或生成器表达式/函数运行得更快。如果它运行得更快,代码将如何运行?还在学习Python。谢谢你的帮助
input = open('C:/.../list.txt', 'r')
output = open('C:/.../output.txt', 'w')
x=0
for line in input:
x = x+1
if x > 2 and x < 5:
output.write(line)
列表文件有
1
2
3
4
5
新文件中的输出是
3
4
答案 0 :(得分:6)
无需列表理解。
output.write(''.join(itertools.islice(inputfile, 2, 4))
答案 1 :(得分:2)
如果你想用发电机做这件事:
output.writelines(line for line in input if 2 < int(line) < 5)
答案 2 :(得分:1)
不是更快,但如果你想使用列表理解:
output.writelines([line for (x, line) in enumerate(input) if 1 < x < 4])
这假设您正在使用文件位置的实际行数而不是文件中的读取值(根据您的x分配判断为真)。
答案 3 :(得分:0)
你特别询问了生成器与列表理解,但总的来说有一些是解决问题的方法。
生成器版本:
input = open('input.txt', 'r')
output = open('output.txt', 'w')
def gen() :
for line in input :
yield "FOO " + line
for l in gen() :
output.write(l)
列表理解:
output.writelines("FOO " + line for line in input)
迭代器风格:
class GenClass(object) :
def __init__(self, _in) :
self.input = _in
def __iter__(self):
return self
def next(self) :
line = self.input.readline()
if len(line) == 0 :
raise StopIteration
return "FOO " + line
output.writelines(GenClass(input))
思想:
答案 4 :(得分:0)
找出哪个最快的最佳方法是测试它!
在这段代码中,我假设您关心的是行的值,而不是哪个行号。
import timeit
def test_comprehension():
input = open('list.txt')
output = open('output.txt','w')
[output.write(x) for x in input if int(x) > 2 and int(x) < 5]
def test_forloop():
input = open('list.txt')
output = open('output.txt','w')
for x in input:
if int(x) > 2 and int(x) < 5:
output.write(x)
if __name__=='__main__':
times = 10000
from timeit import Timer
t = Timer("test_comprehension()", "from __main__ import test_comprehension")
print "Comprehension: %s" % t.timeit(times)
t = Timer("test_forloop()", "from __main__ import test_forloop")
print "For Loop: %s" % t.timeit(times)
在这里我只是设置了几个函数,一个用列表理解来完成它,另一个用它作为forloop。 timeit模块按指定的次数运行少量代码,对其进行计时并返回运行所花费的时间。因此,如果您运行上面的代码,您将获得以下内容的输出:
理解:0.957081079483 For Loop:0.956691980362
令人沮丧的是,这两种方式大致相同。
答案 5 :(得分:0)
def copyLines(infname, outfname, lines):
lines = list(set(lines)) # remove duplicates
lines.sort(reverse=True)
with open(infname, 'r') as inf, open(outfname, 'w') as outf:
try:
i = 1
while lines:
seek = lines.pop()
while i<seek:
inf.next()
i += 1
outf.write(inf.next())
i += 1
except StopIteration: # hit end of file
pass
def main():
copyLines('C:/.../list.txt', 'C:/.../output.txt', range(3,5))
if __name__=="__main__":
main()
请注意,只要耗尽所需的行,它就会退出。