Scipy - выполнение части функции только при изменении входных значений функции - PullRequest
0 голосов
/ 08 декабря 2011

Я пытался оптимизировать этот код:

def spectra(mE, a):
    pdf = lambda E: np.exp(-(a+1)*E/mE)*(((a+1)*E/mE)**(a+1))/(scipy.special.gamma(a+1)*E)
    u=[]
    n=np.random.uniform()
    E=np.arange(0.01,150, 0.1)
    for i in E: 
        u.append(scipy.integrate.quad(pdf,0,i)[0])

    f=interp1d(u, E)
    return f(n)

Я пытался создать таблицу поиска из f, но похоже, что каждый раз, когда я вызываю функцию, она выполняет интеграцию всехснова.Есть ли способ вставить что-то вроде оператора if, который позволит мне создать f один раз для значений mE и a, а затем просто вызвать его потом?

Спасибо за помощь.

Приветствия.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Похоже, что вы хотите сделать, это вернуть известное значение, если функция вызывается повторно с теми же значениями (mE, a), и выполнить вычисление, если ввод новый. запоминание .См. Например Что такое памятка и как я могу использовать ее в Python? .Обратите внимание, что в современных версиях Python вы можете создать декоратор , чтобы применить функцию напоминания о функции, что позволит вам быть немного аккуратнее.

0 голосов
/ 08 декабря 2011

Скорее всего, вы не сможете хранить значения спектров (x, y) и разумно извлекать их по точным значениям с плавающей точкой x и у . В реальной жизни вы редко встречаетесь с одинаковыми значениями с плавающей запятой.

Обратите внимание, что я не думаю, что вы можете кэшировать f напрямую, потому что это зависит от длинного списка чисел с плавающей запятой. Его возможное пространство для ввода настолько велико, что найти близкое совпадение мне кажется невероятным.

Если вы кешируете значения spectra(), вы можете получить значение для достаточно близкой пары аргументов с разумной вероятностью.

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

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

Большое предварительное условие , конечно, заключается в том, что достаточное количество точек в кеше может быть использовано повторно. Чтобы оценить это, запустите некоторые из своих расчетов и сохраните где-нибудь пары (mE, a) (например, в файле), а затем нанесите их на график. Вы сразу увидите, есть ли у вас группы точек, близкие друг к другу. Конечно, вы также можете искать узкие кластеры без черчения. Если у вас достаточно узких кластеров (где вы можете повторно использовать значение одной точки для другой), ваш кэш будет работать. Если нет, не беспокойтесь о его реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...