эффективный / умный способ вычислить физическую формулу в python - PullRequest
1 голос
/ 09 мая 2020

Я ищу эффективный способ вычисления результата (сложной) математической функции.

прямо сейчас он выглядит сопоставимым с:

def f(x):
    return x**2
def g(x):
    if not x: return 1
    return f(x)*5
def h(x):
    return g(x)

with concurrent.futures.ProcessPoolExecutor() as executor:
    print(list(executor.map(h, params)))

, поскольку каждый вызов функции дорого в Python, код уже должен работать быстрее, если f (x) объединить с g (x). К сожалению, в этом случае строка return ... функции g (x) уже становится очень длинной. Более того, в настоящее время всего определено 6 функций, поэтому полная формула занимает несколько строк.

Итак, какой же умный способ вычислить результат формулы физики?

РЕДАКТИРОВАТЬ:

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

Чтобы быть более конкретным c У меня есть потенциал и я хочу реализовать его параллельно. Поэтому я вызываю свою версию «h (x)», используя функцию карты ProcessPoolExecutor (каждый раз с разными значениями). Но лучше ли определять функцию как функцию, которая вызывает другие функции или использует переменные? Есть способ более действенный?

Ответы [ 2 ]

1 голос
/ 09 мая 2020
def formula(x):
    if not x :
        return 1
    return x*x*5
1 голос
/ 09 мая 2020

Я не думаю, что строка может оказаться проблематично длинной, но если вас беспокоит длина строки return ..., вы можете использовать промежуточные значения, например:

def g(x):
    if x == 0:
        return 1
    x2 = x ** 2
    return x2 * 5

Кстати, в этом контексте неправильно использовать оператор is, как в x is 0. Он не проверяет числовое равенство, что и делает ==. Оператор is проверяет, ссылаются ли два операнда на один и тот же объект в памяти, что в данном случае имеет то же поведение, что и ==, поскольку интерпретатор Python разумно повторно использует числовые объекты. Это может привести к сбивающим с толку ошибкам, например:

a = 1234
b = 1233
a == (b + 1) # True
a is (b + 1) # False

На практике is в основном используется только для проверки наличия значения is None.

...