Что быстрее: x*x или x**2?

Я пытаюсь оптимизировать свой код Python. Между:

y = x*x

or

y = x**2

если мне нужен один триллион итераций в критической по скорости программе, какую из них выбрать?


person kmonsoor    schedule 25.12.2013    source источник
comment
@ChrisHayes: на самом деле я сделал это для алгоритма Гаусса-Лежандра в python. В то время x*x был быстрее, чем x**2.   -  person jfs    schedule 26.12.2013
comment
@TonyHopkinson Python используется во многих научных вычислениях, несмотря на то, что он мучительно медленный (обычно он используется для вызова оптимизированных библиотек, таких как numpy).   -  person Aleksandr Dubinsky    schedule 26.12.2013
comment
Вы когда-нибудь видели код, который пишут математики и инженеры? Микрооптимизация — наименьшая из их проблем. :(   -  person Tony Hopkinson    schedule 26.12.2013
comment
@roippi и др. даже спустя более 4 лет я еще не понял, почему этот вопрос не по теме. Кто-нибудь, пожалуйста, просветите меня или удалите честь не по теме.   -  person kmonsoor    schedule 20.03.2018
comment
Это кажется закономерным вопросом. В Python 3.6 x*x примерно в 3,5 раза быстрее, чем x**2. Хотя строки кодов операций равны через модуль dis, реализации различаются. В CPython ceval.c x*x использует PyNumber_Multiply и binary_op1 while x**2 использует PyNumber_Power и ternary_op. Мне непонятно, где происходит замедление, но последнее более сложное.   -  person pylang    schedule 23.06.2019


Ответы (1)


x**2 быстрее, чем x*x.

Реализация экспоненты имеет некоторые накладные расходы в Python, поэтому обычно быстрее использовать собственное умножение O(n) с небольшим счетчиком умножения. x*x*x*x*x намного быстрее, чем x**5. Время экспоненты является своего рода константой. Ваше время умножения увеличивается с параметром экспоненты, поэтому с большим параметром лучше использовать экспоненту. Однако при действительно очень маленьком параметре (в вашем случае 2) показатель степени выполняется быстрее, чем умножение. И x**2 быстрее, чем x*x, хотя x**3 намного медленнее, чем x*x*x. Вы можете найти хороший тест в этом ответе.

person gthacoder    schedule 25.12.2013
comment
x*x может быть быстрее, чем x**2. Кажется, вы имели в виду обратное тому, что сказали. - person jfs; 26.12.2013
comment
x**2 — это частный случай, и разница в скорости в моих тестах была довольно небольшой. Так что я думаю, это также может зависеть от x. - person gthacoder; 26.12.2013