Ответ Дрю довольно хорошо показывает, что +=
с массивами в PowerShell не работает; Вы уже нашли причину в своем вопросе (каждый раз создается новый массив, копируются все элементы и т. д.).
Обратите внимание, что ArrayList - не единственная альтернатива. Иногда просто изменить способ, которым вы делаете вещи, будет большая разница; например, циклы и итерации распространены в PowerShell, и создание массива выходных данных по присваиванию очень быстро, а также, на мой взгляд, лучше синтаксис.
Сравните это (2s 406ms
):
Measure-Command -Expression {
$a = @()
1..10000 | % { $a += Ответ Дрю довольно хорошо показывает, что +=
с массивами в PowerShell не работает; Вы уже нашли причину в своем вопросе (каждый раз создается новый массив, копируются все элементы и т. д.).
Обратите внимание, что ArrayList - не единственная альтернатива. Иногда просто изменить способ, которым вы делаете вещи, будет большая разница; например, циклы и итерации распространены в PowerShell, и создание массива выходных данных по присваиванию очень быстро, а также, на мой взгляд, лучше синтаксис.
Сравните это (2s 406ms
):
[110] с этим (60ms
):
Measure-Command -Expression {
$a = 1..10000 | % { Ответ Дрю довольно хорошо показывает, что +=
с массивами в PowerShell не работает; Вы уже нашли причину в своем вопросе (каждый раз создается новый массив, копируются все элементы и т. д.).
Обратите внимание, что ArrayList - не единственная альтернатива. Иногда просто изменить способ, которым вы делаете вещи, будет большая разница; например, циклы и итерации распространены в PowerShell, и создание массива выходных данных по присваиванию очень быстро, а также, на мой взгляд, лучше синтаксис.
Сравните это (2s 406ms
):
[110] с этим (60ms
):
[111]*2 }
}
*2 }
}
с этим (60ms
):
Measure-Command -Expression {
$a = 1..10000 | % { Ответ Дрю довольно хорошо показывает, что +=
с массивами в PowerShell не работает; Вы уже нашли причину в своем вопросе (каждый раз создается новый массив, копируются все элементы и т. д.).
Обратите внимание, что ArrayList - не единственная альтернатива. Иногда просто изменить способ, которым вы делаете вещи, будет большая разница; например, циклы и итерации распространены в PowerShell, и создание массива выходных данных по присваиванию очень быстро, а также, на мой взгляд, лучше синтаксис.
Сравните это (2s 406ms
):
[110] с этим (60ms
):
[111]*2 }
}
with open('myfile.txt', 'r+') as file:
for line in file:
processLine(line)
file.truncate(0)
lines = open('myfile.txt').readlines()
for line in lines[::-1]: # process lines in reverse order
processLine(line)
del lines[-1] # remove the [last] line
open('myfile.txt', 'w').writelines(lines)
import fileinput
for line in fileinput.input(['myfile.txt'], inplace=1):
try: processLine(line)
except Exception:
sys.stdout.write(line) # it prints to 'myfile.txt'
В целом, как другие люди уже сказали, это - плохая идея, что Вы пытаетесь сделать.
Вы - более обеспеченное хранение индекса в файл так, чтобы можно было запустить, где Вы остановились в последний раз, не уничтожая часть файла. Что-то вроде этого работало бы:
try :
for index, line in enumerate(file) :
processLine(line)
except :
# Failed, start from this line number next time.
print(index)
raise
При усечении файла, поскольку Вы читаете, это кажется небольшим экстремальным значением. Что, если Ваш сценарий имеет ошибку, которая не вызывает ошибку? В этом случае Вы захотите перезапустить в начале своего файла.
Как насчет того, чтобы иметь Ваш сценарий печатают номер строки, на котором он повреждается, и иметь его берут номер строки в качестве параметра, таким образом, можно сказать его который строка начать обрабатывать от?
В первую очередь, вызов операции truncate
вероятно, не лучший выбор. Если я понимаю проблему правильно, Вы хотите удалить все до текущей позиции в файле. (Я ожидал бы truncate
сокращать все из текущей позиции в конец файла. Это то, как стандартный Python truncate
работы метода, по крайней мере, если я Погугленный правильно.)
Во-вторых, я не уверен, что мудро изменить файл при итерации на в использовании for
цикл. Разве не было бы лучше сохранить количество обработанных строк и удалить их после того, как основной цикл закончился, исключение или нет? Итератор файла поддерживает оперативную фильтрацию, что означает, что должно быть довольно просто отбросить обработанные строки впоследствии.
P.S. Я не знаю Python, беру это с мелкой частицей соли.
Вы не можете. Это просто не возможно с фактическими реализациями текстового файла в текущих файловых системах.
Текстовые файлы последовательны, потому что строки в текстовом файле могут иметь любую длину. Удаление конкретной строки означало бы переписывать весь файл от той точки на.
Предположим, что у Вас есть файл со следующими 3 строками;
'line1\nline2reallybig\nline3\nlast line'
Для удаления второй строки, необходимо было бы переместить положения третьих и четвертых строк в диск. Единственный путь состоял бы в том, чтобы сохранить третьи и четвертые строки где-нибудь, усечь файл на второй строке и переписать недостающие строки.
Если Вы знаете размер каждой строки в текстовом файле, можно усечь файл в любом использовании положения .truncate(line_size * line_number)
но даже затем необходимо было бы переписать все после строки.
В связанном сообщении есть хорошая стратегия для этого, см. Как запустить первый процесс из списка процессов, хранящихся в файле, и немедленно удалить первую строку, как если бы файл был очередью, и я вызвал «pop»?
Я использовал его следующим образом:
import os;
tasklist_file = open(tasklist_filename, 'rw');
first_line = tasklist_file.readline();
temp = os.system("sed -i -e '1d' " + tasklist_filename); # remove first line from task file;
Я не уверен, что он работает в Windows. { {1}} Попробовал на Mac, и это помогло.