Есть ли хороший способ в Python измерить количество обращений к памяти или мемов, используемых функцией?
Когда люди спрашивают о памяти, они часто спрашивают, сколько памяти используется, но я не это имею в виду.
Скорее, я читаю книгу Дональда Кнута «Искусство компьютерного программирования» и воссоздаю некоторые алгоритмы на Python. Кнут измеряет время, которое потребовалось для запуска одной из его программ в памяти , то есть количество раз, когда область памяти считывалась или записывалась. Это хороший способ измерить время, затрачиваемое алгоритмом, как точное число, более независимое от архитектуры или скорости чипа.
В качестве примера того, что я ищу, рассмотрим этот пример сценария:
mylist = [1, 2, 3]
x = 2
y = mylist[x]
Можно сказать, что здесь 5 мемов, например:
mylist = [1, 2, 3] # Write to `mylist`. 1 mem
x = 2 # Write to `x`. 1 mem
y = mylist[x] # Read from `x`, `mylist`; write to `y`. 3 mems
Вы также можете возразить, что назначение
Прямо сейчас я просто пытаюсь решить проблему высокого уровня, заключающуюся в том, чтобы иметь какой-то (любой) способ разумного измерения мемов, в идеале без необходимости делать какое-либо причудливое магическое кодирование :) Позже я могу начать больше беспокоиться о деталях. например, «как лучше всего» или «сколько мемов должна считаться эта строка», но этот вопрос сосредоточен на том, «как начать делать это первым?»
И я имею в виду программно, например, я запускаю функцию, а где-то в Python есть переменная, которая отслеживает количество мемов, используемых при запуске функции. (В отличие, скажем, от человека, который статически анализирует программу для подсчета или вручную добавляет
1 ответ
На самом деле я не знаю, как это сделать, но думаю, что это противоречило бы первоначальной рекомендации Кнута. В Stanford GraphBase он заявил:
#define o mems++
#define oo mems += 2
#define ooo mems += 3
а затем приступил к добавлению этих макросов вручную, например
...
o, a->from = v;
oo, a->klink = aucket[l];
...
Причины его поступка были
(1) Макросы можно легко и быстро вставить с помощью текстового редактора. (2) Реализации не нужно платить за мемы, которых можно избежать с помощью подходящего оптимизирующего компилятора или немного усложнив текст программы на языке C; таким образом, авторы могут использовать свой здравый смысл, чтобы сделать программы более читабельными, чем если бы код был чрезмерно оптимизирован вручную. (3) Программист должен иметь возможность видеть, где именно заряжаются мемы, чтобы помочь устранить узкие места. Использование o и oo делает это понятным, не искажая текст программы. (4) Реализация не должна взимать плату за мемы, которые просто предоставляют диагностические данные, или мемы, которые выполняют избыточные вычисления только для двойной проверки достоверности «доказанных» утверждений во время тестирования программы.
Что касается того, что «метрика не имеет смысла», поскольку Python не похож на C или Assembly, обратите внимание, что Кнут предложил это для сравнения алгоритмов с точки зрения обращений к памяти. Таким образом, даже если Python имеет дело с указателями, это все равно может быть полезным для сравнения конкурирующих реализаций.