Мы можем использовать переменную Python для содержания всего файла?

Дерево выражений является механизмом для перевода исполняемого кода в данные. Используя дерево выражений, можно произвести структуру данных, которая представляет программу.

В C#, можно работать с деревом выражений, произведенным лямбда-выражениями при помощи Expression<T> класс.

<час>

В традиционной программе, Вы пишете код как это:

double hypotenuse = Math.Sqrt(a*a + b*b);

Этот код заставляет компилятор генерировать присвоение, и вот именно. В большинстве случаев это - все, о чем Вы заботитесь.

Со стандартным кодом, Ваше приложение не может пойти задним числом назад и взгляд hypotenuse, чтобы решить, что это было произведено путем выполнения Math.Sqrt() вызов; этой информацией является просто не часть того, что включено.

Теперь, рассмотрите лямбда-выражение как следующее:

Func<int, int, int> hypotenuse = (a, b) => Math.Sqrt(a*a + b*b);

Это немного отличается, чем прежде. Теперь hypotenuse на самом деле ссылка на [1 110] блок исполняемого кода . Если Вы будете звонить

hypotenuse(3, 4);

, то Вы доберетесь, значение 5 возвратилось.

Мы можем использовать деревья выражений для исследования блока исполняемого кода, который был произведен. Попробуйте это вместо этого:

Expression<Func<int, int, int>> addTwoNumbersExpression = (x, y) => x + y;
BinaryExpression body = (BinaryExpression) addTwoNumbersExpression.Body;
Console.WriteLine(body);

Это производит:

(x + y)

Более усовершенствованные методы и манипуляции возможны с деревьями выражений.

7
задан Community 23 May 2017 в 11:58
поделиться

5 ответов

Несмотря на то, что вы получили хорошие ответы, похоже, что никто не ответил на эту часть вашего вопроса (как часто бывает, когда вы задаете много вопросов в вопросе; -) ...:

Что касается размера файла, к чему максимальный размер этого решения должен быть ограниченное ?. И почему?

Наиболее важным является то, сколько физической памяти может фактически использовать этот конкретный процесс Python (так называемый «рабочий набор»), без чрезмерного ущерба для других аспектов общей производительности системы. . Если вы превысите физическую оперативную память для своего «рабочего набора», вы будете разбивать на страницы и переключаться на диск и обратно, и ваша производительность может быстро ухудшиться (до состояния, известного как «перегрузка», когда в основном все доступные циклы идут на задачи по загрузке и отправке страниц, и на самом деле можно выполнить незначительный объем фактической работы).

Из этого общего количества, вероятно, будет затрачено достаточно скромное количество (скажем, не более нескольких МБ) исполняемым кодом (собственные исполняемые файлы Python, библиотеки DLL или .so ' s), а также байт-код и структуры данных общей поддержки, которые активно используются в памяти; на типичной современной машине, которая не выполняет другие важные или срочные задачи, вы можете почти игнорировать эти накладные расходы по сравнению с гигабайтами оперативной памяти, которые у вас есть в целом (хотя ситуация может быть иной во встроенных системах и т. д.).

Все rest доступен для ваших данных, включая этот файл, который вы читаете в память, а также любые другие важные структуры данных. «Модификации» данных файла обычно могут занимать (временно) вдвое больше памяти, чем размер содержимого файла (если вы храните его в виде строки) - больше, конечно, если вы храните копию старые данные, а также создание новых измененных копий / версий.

Так что для "только для чтения" использование на типичной современной 32-битной машине с, скажем, 2 ГБ ОЗУ в целом, чтение в память (скажем) 1,5 ГБ не должно быть проблемой; но он должен быть существенно меньше 1 ГБ, если вы делаете «модификации» (и даже меньше, если у вас есть другие важные структуры данных в памяти!). Конечно, на выделенном сервере с 64-битной сборкой Python, 64-битной ОС и 16 ГБ ОЗУ практические ограничения перед этим сильно различаются - примерно пропорционально фактически разному количеству доступной ОЗУ.

Например, текст Библии короля Якова, загружаемый здесь (разархивированный), составляет около 4,4 МБ; Таким образом, на машине с 2 ГБ ОЗУ вы можете сохранить в памяти около 400 слегка измененных копий (если ничто другое не запрашивает память), но на машине с 16 (доступной и адресуемой) ОЗУ,

8
ответ дан 6 December 2019 в 06:37
поделиться
  • Да, можно
  • Единственным недостатком является использование памяти, а также возможная скорость, если файл большой.
  • Размер файла должен быть ограничен объемом памяти, имеющимся у вас. .

В общем, есть способы сделать это лучше, но для разовых сценариев, где вы знаете, что память не является проблемой, конечно.

11
ответ дан 6 December 2019 в 06:37
поделиться
with open(filename) as f:

Это работает только на Python 2.x в Unix. Он не будет делать то, что вы ожидаете от Python 3.x или Windows, поскольку они оба проводят четкое различие между текстовыми и двоичными файлами. Лучше указать, что файл является двоичным, например:

with open(filename, 'rb') as f:

Это отключит преобразование CR / LF ОС в Windows и заставит Python 3.x возвращать массив байтов, а не символы Unicode.

Как в остальном я согласен с (неотредактированным) ответом Леннарта Регебро.

4
ответ дан 6 December 2019 в 06:37
поделиться

Единственная проблема, которую вы можете столкнуться с потреблением памяти: строки в Python неизменяемы. Поэтому, когда вам нужно изменить байт, вам нужно скопировать старую строку:

new = old[0:pos] + newByte + old[pos+1:]

Для этого потребуется до трех раз больше памяти, чем old .

Вместо строки вы можете использовать массив . Они предлагают гораздо лучшую производительность, если вам нужно изменить содержимое, и вы можете легко создать его из строки.

3
ответ дан 6 December 2019 в 06:37
поделиться

Да, вы можете - при условии, что файл достаточно мал -.

Дальнейшее преобразование возврата из read () в любой контейнерный / итеративный тип, например, строка .split () вместе со связанными функциями функционального программирования для продолжения обработки файла «сразу».

0
ответ дан 6 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: