Что быстрее в Python: x **. 5 или math.sqrt (x)? - PullRequest
162 голосов
/ 29 ноября 2008

Мне давно интересно. Как говорится в названии, что быстрее, фактическая функция или просто повышение до половины мощности?

UPDATE

Это не вопрос преждевременной оптимизации. Это просто вопрос о том, как на самом деле работает базовый код. Какова теория того, как работает код Python?

Я послал Гвидо ван Россуму электронное письмо, потому что я действительно хотел знать различия в этих методах.

Мой электронный адрес:

Существует как минимум 3 способа сделать квадратный корень в Python: math.sqrt, оператор ** и pow (x, .5). Мне просто любопытно, что касается различий в реализация каждого из них. Когда дело доходит до эффективности, которая лучше?

Его ответ:

Pow и ** эквивалентны; math.sqrt не работает для комплексных чисел, и ссылки на функцию C sqrt (). Что касается того, кто быстрее я понятия не имею ...

Ответы [ 14 ]

0 голосов
/ 18 октября 2018

Пифоническая вещь для оптимизации - читабельность. Для этого я думаю, что явное использование функции sqrt лучше. Сказав это, давайте все равно исследуем производительность.

Я обновил код Клаудиу для Python 3, а также сделал невозможным оптимизировать вычисления (что может сделать хороший компилятор Python в будущем):

from sys import version
from time import time
from math import sqrt, pi, e

print(version)

N = 1_000_000

def timeit1():
  z = N * e
  s = time()
  for n in range(N):
    z += (n * pi) ** .5 - z ** .5
  print (f"Took {(time() - s):.4f} seconds to calculate {z}")

def timeit2():
  z = N * e
  s = time()
  for n in range(N):
    z += sqrt(n * pi) - sqrt(z)
  print (f"Took {(time() - s):.4f} seconds to calculate {z}")

def timeit3(arg=sqrt):
  z = N * e
  s = time()
  for n in range(N):
    z += arg(n * pi) - arg(z)
  print (f"Took {(time() - s):.4f} seconds to calculate {z}")

timeit1()
timeit2()
timeit3()

Результаты могут отличаться, но пример вывода:

3.6.6 (default, Jul 19 2018, 14:25:17) 
[GCC 8.1.1 20180712 (Red Hat 8.1.1-5)]
Took 0.3747 seconds to calculate 3130485.5713865166
Took 0.2899 seconds to calculate 3130485.5713865166
Took 0.2635 seconds to calculate 3130485.5713865166

Попробуй сам.

0 голосов
/ 23 ноября 2017

Проблема SQRMINSUM , которую я недавно решил, требует многократного вычисления квадратного корня для большого набора данных. Самые старые 2 представления в моей истории , до того как я провел другие оптимизации, отличаются только заменой ** 0,5 на sqrt (), что сокращает время выполнения с 3,74 до 0,51 с в PyPy. Это почти вдвое больше и без того значительного улучшения на 400%, которое измерял Клавдиу.

0 голосов
/ 24 марта 2015

Что будет еще быстрее, если вы зайдете в math.py и скопируете функцию «sqrt» в свою программу. Вашей программе требуется время, чтобы найти math.py, затем открыть его, найти нужную функцию и затем вернуть ее в свою программу. Если эта функция быстрее даже с шагами «поиска», то сама функция должна быть ужасно быстрой. Возможно сократит ваше время пополам. В итоге:

  1. Перейти к math.py
  2. Найти функцию "sqrt"
  3. Скопируйте
  4. Вставьте функцию в вашу программу как sqrt finder.
  5. Время.
0 голосов
/ 29 ноября 2008

Возможно, вы захотите сравнить и быстрый квадратный корень Ньютона-Рафсона . Не нужно много переходить на Python.

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