python 3 - 逐行优化

时间:2014-03-19 18:02:17

标签: python-3.x prepend

我正在研究一个简单的数据前置程序。我在文本文档中的单独行上有一长串(大约15,000个)条形码。我想在每个条形码前加上一个代码(例如'a:')。我创建了一个程序,它将读取文本文件,预先添加数据,然后将结果写入单独的文件。代码是:

bcodeIn = open('bcode.txt', encoding="utf8")
for line in bcodeIn:
    prepend = "a:"+line

    with open('bcode_prepend.txt', 'a', encoding='utf-8') as file:
        file.write(prepend)

由于文件的长度,这是最好的方法吗?记忆方式是否有更有效的方式?

1 个答案:

答案 0 :(得分:1)

我想到了一个重要的事情,那就是你不应该为你的一万五千行中的每一行重新打开输出文件。使用上下文管理器交换循环,您可能会看到加速:

bcodeIn = open('bcode.txt', encoding="utf8")
with open('bcode_prepend.txt', 'a', encoding='utf-8') as file:
    for line in bcodeIn:
        file.write("a:"+line)

您还可以通过创建整个输出字符串(使用join)然后立即写入来提高性能。这将减少您的字符串连接以及文件写入次数。我的测试表明这提供了适度的加速,但如果您的线路非常长或硬件有限,您的结果可能会有所不同。

当你特别要求“记忆效率”效率时,我觉得有必要指出一次写完整个字符串会消耗更多的内存,尽管可能不足以成为一个问题!

与往常一样,testing it yourself没有真正的替代品!

bcodeIn = open('bcode.txt', encoding="utf8")
with open('bcode_prepend.txt', 'a', encoding='utf-8') as file:
    file.write('a:')
    file.write('a:'.join(line for line in bcodeIn))

对于后代,这是我的时间结果。 As usual,使用str.join证明明显优于重复连接。

>>> import timeit
>>> s = '''import random
... import io
... data = [str(random.randint(0,100)) for _ in range(1000)]
... out = io.StringIO()'''
>>> plus = '''for n in data:
...     out.write('a:'+n)'''
>>> form = '''for n in data:
...     out.write('a:{}'.format(n))'''
>>> join = '''out.write('a:'+('a:'.join(n for n in data)))'''
>>> min(timeit.repeat(plus, s, number=10000, repeat=20))
1.5328539289755554
>>> min(timeit.repeat(form, s, number=10000, repeat=20))
3.371942257764431
>>> min(timeit.repeat(join, s, number=10000, repeat=20))
0.5443316215198593
>>>