Я не уверен, как именно вы измеряете занятость памяти, но, глядя на объем памяти всего приложения, может произойти гораздо больше, что приводит к увеличению объема памяти.
В этом случае я подозреваю, что функция loadtxt
использует некоторую буферизацию или иным образом копирует данные, которые еще не были очищены GC.
Но могут происходить и другие вещи. Возможно, numy back-end загружает некоторые дополнительные вещи при первой инициализации ndarray
. В любом случае, вы могли бы по-настоящему разобраться в этом, только прочитав обалденный источник, который свободно доступен на github. Реализацию loadtxt
можно найти здесь: https://github.com/numpy/numpy/blob/5b22ee427e17706e3b765cf6c65e924d89f3bfce/numpy/lib/npyio.py#L797
К моему знанию это не возможно, если Вы не копаетесь в большем количестве материала низкого уровня как полноэкранные эмуляторы как проклятия.
Это - определенный удар в темноте, но Вы можете использовать терминальные коды VT102 для управления курсором, не имея необходимость использовать Проклятия. Соответствующий VT102 управляет, чтобы Вам было бы интересно всего, состоят из отправки ESC, затем [затем определенные параметры команды.
Например, для перемещения курсора одна строка нужно произвести:
ESC [ 1 A
0x1B 0x5B 0x31 0x41
Предупредите, что документация VT102 обычно использует восьмеричный, поэтому сохраните таблицу ASCII удобной при использовании шестнадцатеричного числа.
Не всего этого совета дают протестировав его - я не знаю, могут ли команды VT102 быть встроены в Вашу подсказку удара, но я думал, что это могло бы стоить того, чтобы попытаться.
Править: Да - похож на большое количество VT102 использования людей, форматирующего коды в их подсказках удара. Для перевода моего выше примера во что-то, Bash распознал бы, поместив:
\e[1A
в Вашу подсказку должен переместить курсор одна строка.
Я верю (но не попробовали), если Вы помещаете '\n\b'
в строке приглашения это сделало бы это.
This is very possible. If your bash has C-v
set as the readline quoted-insert command, you can simply add the following to your ~/.inputrc
:
RETURN: "\C-e\C-v\n\C-v\n\n"
This wil make bash (readline, actually) insert two verbatim newlines before a regular interpreted newline. By default, only one is inserted, which is what causes output to start on the line after the prompt.
You can test if C-v
is set to quoted-insert by typing it in bash (that's Ctrl+V
) followed by e.g. an up arrow. This should print ^[[A
or something similar. If it doesn't, you can bind it in ~/.inputrc
too:
C-v: quoted-insert
RETURN: "\C-e\C-v\n\C-v\n\n"
~/.inputrc
can be created if it doesn't exist. The changes will not take effect in running bashes unless you issue a readline re-read-init-file command (by default on C-x C-r
). Be careful though. If you do something wrong, enter will no longer issue commands, and fixing your mistake could prove to be difficult. If you should do something wrong, C-o
will by default also accept the line.
Adding a newline followed by moving the cursor back to the regular prompt (like you described) is possible, but will not have the effect you intend. The newline you inserted would simply be overwritten by the application output, since you moved the cursor back in front of it.
В общем, если вы хотите узнать коды для чего-либо, что может делать терминал, прочтите справочную страницу terminfo
.
В этом случае курсор вверх на одну строку код может быть определен следующим образом:
tput cuu1
Если вы перенаправляете вывод tput в файл, вы можете увидеть, какие управляющие символы используются.
Bash также поддерживает переменную PROMPT_COMMAND, что позволяет вам запускать произвольные команды перед каждым запросом.
Это работает:
trap echo DEBUG
Он не добавляет лишнюю новую строку, если вы нажимаете return в пустом приглашении.
Приведенная выше команда вызовет вывод новой строки для каждого члена конвейера или мультикомандной строки, например:
$ echo foo; echo bar
\n
foo
\n
bar
Чтобы предотвратить это, чтобы выводился только один дополнительный символ новой строки перед всем выводом команды:
PROMPT_COMMAND='_nl=true'; trap -- '$_nl && [[ $BASH_COMMAND != $PROMPT_COMMAND ]] && echo; _nl=false' DEBUG
Ловушка DEBUG
выполняется перед каждой командой, поэтому перед первой командой она проверяет, установлен ли флаг, и, если да, выводит новую строку. Затем он устанавливает флаг в значение false, чтобы каждая последующая команда в строке не запускала дополнительный перевод строки.
Содержимое $ PROMPT_COMMAND
выполняется до вывода подсказки, поэтому для флага устанавливается значение «истина» - готовность к следующему циклу.
Поскольку нажатие Enter в пустой командной строке по-прежнему запускает выполнение содержимого $ PROMPT_COMMAND
, тест в ловушке также проверяет это содержимое как текущую команду и не выполняет echo
, если они совпадают.