Мне было интересно это в течение некоторого времени. Как следует из названия, что быстрее, фактическая функция или просто повышение до половины мощности?
ОБНОВИТЬ
Это не вопрос преждевременной оптимизации. Это просто вопрос того, как на самом деле работает базовый код. Какова теория того, как работает код Python?
Я послал Гвидо ван Россуму электронное письмо, потому что я действительно хотел знать различия в этих методах.
Моя электронная почта:
Существует как минимум 3 способа сделать квадратный корень в Python: math.sqrt, оператор '**' и pow (x, .5). Мне просто любопытно относительно различий в реализации каждого из них. Что касается эффективности, что лучше?
Его ответ:
pow и ** эквивалентны; math.sqrt не работает для комплексных чисел и ссылается на функцию C sqrt (). Что касается того, который быстрее, я понятия не имею ...
math.sqrt
это более оптимизированная процедура (как она есть) и она выражает намерение более четко, ее всегда следует отдавать предпочтениеx**.5
. Это не преждевременная оптимизация, чтобы знать, что вы пишете, и выбрал альтернативу, которая быстрее и обеспечивает большую ясность кода. Если это так, вам нужно одинаково хорошо спорить, почему вы бы выбрали другие альтернативы.Ответы:
math.sqrt(x)
значительно быстрее чемx**0.5
.Использование Python 3.6.9 ( записная книжка ).
источник
Вот некоторые моменты времени (Python 2.5.2, Windows):
Этот тест показывает, что
x**.5
немного быстрее, чемsqrt(x)
.Для Python 3.0 результат противоположен:
math.sqrt(x)
всегда быстрее, чемx**.5
на другой машине (Ubuntu, Python 2.6 и 3.1):источник
Сколько квадратных корней вы действительно исполняете? Вы пытаетесь написать движок 3D-графики на Python? Если нет, то зачем идти с кодом, который является загадочным по сравнению с кодом, который легко читать? Разница во времени будет меньше, чем кто-либо мог заметить практически в любом приложении, которое я мог предвидеть. Я действительно не хочу задавать ваш вопрос, но кажется, что вы слишком далеко зашли с преждевременной оптимизацией.
источник
В этих микро-бенчмарках
math.sqrt
будет медленнее, из-за небольшого времени, которое требуется для поискаsqrt
в математическом пространстве имен. Вы можете немного улучшить егоТем не менее, несмотря на несколько изменений во времени, они показывают небольшое (4-5%) преимущество в производительности для
x**.5
Интересно, занимаюсь
ускорили его еще больше, с точностью до 1% разницы в скорости, с очень небольшой статистической значимостью.
Я повторю Кибби и скажу, что это, вероятно, преждевременная оптимизация.
источник
В Python 2.6
(float).__pow__()
функция использует функцию C,pow()
аmath.sqrt()
функции - Csqrt()
функцию.В компиляторе glibc реализация
pow(x,y)
довольно сложна и хорошо оптимизирована для различных исключительных случаев. Например, вызов Cpow(x,0.5)
просто вызываетsqrt()
функцию.Разница в скорости использования
.**
илиmath.sqrt
вызвана оболочками, используемыми вокруг функций C, и скорость сильно зависит от флагов оптимизации / компилятора C, используемых в системе.Редактировать:
Вот результаты алгоритма Клавдия на моей машине. Я получил разные результаты:
источник
Для чего это стоит (см. Ответ Джима). На моей машине работает python 2.5:
источник
используя код Клаудиу, на моей машине даже с "from math import sqrt" x **. 5 быстрее, но использование psyco.full () sqrt (x) становится намного быстрее, по крайней мере, на 200%
источник
Скорее всего, math.sqrt (x), потому что он оптимизирован для квадратного корня.
Тесты предоставят вам ответ, который вы ищете.
источник
Кто-то прокомментировал «быстрый квадратный корень Ньютона-Рафсона» из Quake 3 ... Я реализовал его с помощью ctypes, но он очень медленный по сравнению с нативными версиями. Я собираюсь попробовать несколько оптимизаций и альтернативных реализаций.
Вот еще один метод, использующий struct, который примерно в 3,6 раза быстрее, чем версия ctypes, но все еще на 1/10 скорости C.
источник
Результаты Клавдия отличаются от моих. Я использую Python 2.6 на Ubuntu на старой машине P4 2.4Ghz ... Вот мои результаты:
sqrt всегда быстрее для меня ... Даже Codepad.org СЕЙЧАС, похоже, согласен с тем, что sqrt в локальном контексте быстрее ( http://codepad.org/6trzcM3j ). Кажется, сейчас Codepad работает под управлением Python 2.5. Возможно, они использовали 2.4 или старше, когда Клаудиу впервые ответил?
На самом деле, даже используя math.sqrt (i) вместо arg (i), я получаю лучшие времена для sqrt. В этом случае timeit2 () заняло от 0,53 до 0,55 секунды на моей машине, что все же лучше, чем 0,56-0,60 с timeit1.
Я бы сказал, что в современном Python используйте math.sqrt и определенно перенесите его в локальный контекст, либо с помощью somevar = math.sqrt, либо с помощью команды math import sqrt.
источник
Pythonic вещь для оптимизации это читабельность. Для этого я думаю, что явное использование
sqrt
функции лучше. Сказав это, давайте все равно исследуем производительность.Я обновил код Клаудиу для Python 3, а также сделал невозможным оптимизировать вычисления (что может сделать хороший компилятор Python в будущем):
Результаты могут отличаться, но пример вывода:
Попробуй сам.
источник
Проблема SQRMINSUM, которую я недавно решил, требует многократного вычисления квадратного корня для большого набора данных. 2 самых старых представления в моей истории , до того, как я провел другие оптимизации, отличаются только заменой ** 0,5 на sqrt (), что сокращает время выполнения с 3,74 до 0,51 в PyPy. Это почти вдвое больше и без того значительного улучшения на 400%, которое измерял Клавдиу.
источник
Конечно, если кто-то имеет дело с литералами и ему нужно постоянное значение, среда выполнения Python может предварительно рассчитать значение во время компиляции, если оно написано с помощью операторов - нет необходимости профилировать каждую версию в этом случае:
источник
Что будет еще быстрее, если вы зайдете в math.py и скопируете функцию «sqrt» в свою программу. Вашей программе требуется время, чтобы найти math.py, затем открыть его, найти нужную функцию и затем вернуть ее в свою программу. Если эта функция быстрее даже с шагами «поиска», то сама функция должна быть ужасно быстрой. Вероятно, сократит ваше время пополам. В итоге:
источник
from math import sqrt
?