2014-03-19 31 views
1

我正在開發一個簡單的數據前置程序。我在文本文檔的單獨行中列出了一個長列表(大約15,000)條形碼。我想用一個代碼(例如'a:')預先加上每個條形碼。我已經創建了一個程序來讀取文本文件,預先寫入數據,然後將結果寫入單獨的文件。代碼是:python 3 - 逐行優化prepend

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

想起了一件重要的事情,那就是你不應該爲你的一萬五千行中的每一行重新打開輸出文件。 SWAP與上下文管理的循環,你可能會看到一個加速:

​​

你也可能通過創建(使用join)整體輸出字符串,然後在一次寫它提高性能。這將減少字符串連接以及文件寫入次數。我的測試表明,這提供了適度的加速,但是如果你的線路太長或者硬件有限,你的結果可能會有所不同。當你特別要求「記憶明智」的效率時,我覺得有必要指出,一次寫入整個字符串會消耗更多的內存,但可能不足以成爲一個問題!

與往常一樣,testing ityourself沒有真正的替代!

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 
>>> 
+0

現在快得多。謝謝。 – user3380034