2015-11-01 55 views
1

我有這個名單在python中編寫二進制輸出的最有效方法是什麼?

bytes = ['11010001', '00100111'] 

我想寫的bytes內容在我自己的二進制文件作爲一個字節。因此,我遍歷列表中的每個元素,將其從字符串轉換爲二進制,然後將其作爲該二進制組合表示的字符寫入文件中。

output = open(location+filename + '.enchuff', 'wb') 
for byte in bytes: 
    chunk = int(byte, base=2) 
    output.write(chr(chunk)) 

它運行良好,但問題是當bytes列表變大。我從另一個文件生成它,當我輸入時讓我們說一個100MB的文件讓它讀取,列表變得非常長,我的程序掛在for循環上。我猜測for循環一定是個問題,因爲它可能會迭代數以十萬計的元素並記錄下每一個元素。此外,我的內存消耗從那一點跳到了4GB的內存。有沒有其他方法可以更快實現並保留珍貴的RAM?

+0

你可以在你的輸入文件的內容中創建一個迭代器,並將迭代器傳遞給你的字節轉換函數。不會變得更快,但會保存內存。 –

+0

你能告訴我我該怎麼做到?我真的需要保存公羊。現在,當我輸入太大的文件時,我的整個筆記本電腦的內存已滿,然後我需要重新啓動它。 – Arcane

+0

您可能想嘗試類似[bitarray](https://pypi.python.org/pypi/bitarray/0.8.10)來表示您的位,而不是字符串列表。而不是8位1個字節,而是使用8個字節(對於字符串)+無論列表開銷如何。 – Claudiu

回答

1

您的代碼可能效率不高,因爲您正在爲流中的每個字節執行寫操作。雖然寫入可能會被緩存,但這會發生在較低的級別,每次迭代都會產生相當多的開銷。

你可以代替轉換的字節流在內存中,後來它寫入流,例如:

data = [chr(int(x, base=2)) for x in bytes] 
output.write(''.join(data)) 

如果內存消耗是一個問題,你可以寫在塊轉換後的字節數,如:

chunksize = 1024 
for c in range(0,len(bytes),chunksize): 
    data = [chr(int(x, base=2)) for x in bytes[c:c+chunksize]] 
    output.write(''.join(data)) 
+0

謝謝,最後我用這個。我的問題還有更多,然後在輸出中只是一個糟糕的循環,但這真的有幫助。 – Arcane

相關問題