Лучшие практики для написания простых математических вычислений в Python - PullRequest
4 голосов
/ 30 декабря 2011

Мне нужно выполнить простые математические вычисления в Python 2.7 с суммами, вычитаниями, делениями, умножениями, суммами по спискам чисел и т. Д.

Я хочу написать элегантный, пуленепробиваемый и эффективный код, но яДолжен признать, что меня смутили несколько вещей, например:

  • , если в моем уравнении есть 1/(N-1)*x, должен ли я просто кодировать 1/(N-1)*x или, может быть, 1.0/(N-1)*x, 1.0/(N-1.0)*x или любую другую комбинациюиз них?
  • для деления, я должен использовать // или / с from __future__ import division?
  • , что такое практики, такие как "использование math.fsum() для объединения списка чисел"где-то там?
  • Должен ли я считать, что входные числа являются числами с плавающей запятой, или выполнять преобразование на всякий случай (может быть, риск снижения эффективности при выполнении многих операций float(x))?

Итак, каковы лучшие практики написания кода для простых математических вычислений на Python, который

  1. элегантный / Pythonic,
  2. эффективный,
  3. пуленепробиваемый к проблемам как неопределенность в типе точного числа входных данных (число с плавающей запятой против целого числа)?

Ответы [ 2 ]

13 голосов
/ 30 декабря 2011
  1. Если вы используете Python 2.7, ВСЕГДА используйте from __future__ import division. Это устраняет чертову путаницу и ошибки.

    При этом вам никогда не придется беспокоиться о том, является ли деление плавающим или нет, / всегда будет плавающим, а // всегда будет целым числом.

  2. Вы должны преобразовать свой ввод с помощью float(). Вы сделаете это только один раз, и это не сильно повлияет на производительность.

  3. Я бы получил сумму списка с плавающей точкой, например: sum(li, 0.0), но если требуется точность, используйте math.fsum, который специально создан для этого.

  4. И, наконец, ваше последнее утверждение сбивало с толку. Вы имели в виду 1/((N-1)*x) или (1/(N-1))*x? В первом случае я бы написал это как 1 / (x * (N-1)), а во втором случае x / (N-1). Оба предполагают деление в стиле 3.x.

Кроме того, загляните в numpy, если вам нужна реальная производительность.

2 голосов
/ 08 марта 2012

Если вы хотите отличную производительность для числового кода в Python, вы должны рассмотреть PyPy.Numpy и scipy удобны для работы с массивами, и они дают хорошую производительность, если вы используете предоставляемые ими алгоритмы линейной алгебры.Но если ваши числовые операции выполняются в чистом коде Python, PyPy может значительно повысить производительность.Я видел ускорения выше 20х.И когда вы используете PyPy, лучший способ написать свои математические выражения - это самый простой способ.Он оптимизирует ваш код лучше, чем вы, поэтому сделайте его максимально простым и читабельным.

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