В вашем существующем коде вы можете изменить список на выражение генератора:
dest = "\n".join(line for line in src.split("\n") if line[:1]!="#")
Это очень небольшое изменение позволяет избежать создания одного из двух временных списков в вашем коде и не требует никаких усилий с вашей стороны.
Совершенно другой подход, позволяющий избежать временного построения обоих списков, заключается в использовании регулярного выражения:
import re
regex = re.compile('^#.*\n?', re.M)
dest = regex.sub('', src)
Это позволит избежать не только создания временных списков, но и создания временных строк для каждой строки во входных данных. Вот некоторые измерения производительности предлагаемых решений:
init = r'''
import re, StringIO
regex = re.compile('^#.*\n?', re.M)
src = ''.join('foo bar baz\n' for _ in range(100000))
'''
method1 = r'"\n".join([line for line in src.split("\n") if line[:1] != "#"])'
method2 = r'"\n".join(line for line in src.split("\n") if line[:1] != "#")'
method3 = 'regex.sub("", src)'
method4 = '''
buffer = StringIO.StringIO(src)
dest = "".join(line for line in buffer if line[:1] != "#")
'''
import timeit
for method in [method1, method2, method3, method4]:
print timeit.timeit(method, init, number = 100)
Результаты:
9.38s # Split then join with temporary list
9.92s # Split then join with generator
8.60s # Regular expression
64.56s # StringIO
Как видите, регулярное выражение - самый быстрый метод.
Из ваших комментариев я вижу, что вы не на самом деле заинтересованы в том, чтобы избегать создания временных объектов. Что вы действительно хотите, так это уменьшить требования к памяти для вашей программы. Временные объекты не обязательно влияют на потребление памяти вашей программой, так как Python хорош для быстрой очистки памяти. Проблема заключается в том, что объекты сохраняются в памяти дольше, чем нужно, и все эти методы имеют эту проблему.
Если вам все еще не хватает памяти, я бы посоветовал вам не делать эту операцию полностью в памяти. Вместо этого сохраните входные и выходные данные в файлах на диске и считывайте их потоковым способом. Это означает, что вы читаете одну строку из ввода, записываете строку в вывод, читаете строку, пишете строку и т. Д. Это создаст много временных строк, но даже при этом почти не потребуется памяти, потому что вам нужно только обрабатывать струны по одной за раз.