Поэтому я постоянно вижу, как люди пишут код, и когда они хотят увидеть версию заданного значения в квадрате, они пишут x*x вместо x**2. Есть ли такое большое совпадение эффективности между этими двумя точками, что данная функция в питоне не просто используется, или это просто стилистическая точка? Я бы предпочел использовать оператор **, но если это приведет к огромной ошибке, должен ли я выполнять операцию миллиард раз, я знаю, что это слишком, я хотел бы знать. Кроме того, если я ошибаюсь в порядке величины операций, которые одна берет на себя другой, я также хотел бы, чтобы меня поправили. т.е. если ** более эффективен, чем x*x, то я также хотел бы знать, почему.
* vs ** для операции степени 2
Ответы (2)
Я не согласен с g.d.d.c, умножение намного быстрее!
"""Evaluating the difference in execution time between n*n and n**2"""
from time import time
n = 2
t = time()
for i in range(5000000):
n**2
print("Time for n**2:\t%0.3f" % (time()-t))
t = time()
for i in range(5000000):
n*n
print("Time for n*n:\t%0.3f" % (time()-t))
def test(n):
"""
Difference in execution time between n*n and n**2
within function scope.
"""
t = time()
for i in range(5000000):
n**2
print("Time for n**2:\t%0.3f" % (time()-t))
t = time()
for i in range(5000000):
n*n
print("Time for n*n:\t%0.3f" % (time()-t))
test(n)
Результаты :
Time for n**2: 2.324496030807495
Time for n*n: 0.5879969596862793
Time for n**2: 2.0771241188049316
Time for n*n: 0.2894318103790283
Вы можете видеть, что умножение выполняется примерно в 4 раза быстрее вне функции и в 7 раз быстрее в функции. Я не могу объяснить разницу между этими двумя тестами, и я не уверен в разнице между n*n и n**2, но это может быть связано с тем, что Python является интерпретируемым языком, и обработка последнего занимает больше времени, даже если операции процессора очень похожи, как показывает gddc.
n**2
и n*n
почти идентичны, как и в другом ответе.
- person user2357112 supports Monica; 17.10.2015
locals()
возвращает словарь, но Python на самом деле не использует словарь для поиска локальных переменных. Это одна из причин, по которой в документах не рекомендуется изменять dict; это не повлияет на значения локальных переменных.
- person user2357112 supports Monica; 17.10.2015
n*n
и n**2
. Особенно для глобального эксперимента вы заметите, что это имеет значение.
- person Martin Thoma; 18.10.2015
На самом деле, они, вероятно, очень похожи по общей стоимости:
>>> def s1(x):
... return x * x
...
>>>
>>> def s2(x):
... return x ** 2
...
>>>
>>> from dis import dis
>>>
>>> dis(s1)
2 0 LOAD_FAST 0 (x)
3 LOAD_FAST 0 (x)
6 BINARY_MULTIPLY
7 RETURN_VALUE
>>> dis(s2)
2 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (2)
6 BINARY_POWER
7 RETURN_VALUE
>>>
Я думаю, что вы, вероятно, преждевременно оптимизируете, даже для миллионов или миллиардов итераций. Если вы не определили это как узкое место, просто используйте то, что для вас наиболее идиоматично.
И, для полноты, результаты timeit
:
>>> timeit.Timer("s1(10)", 'from __main__ import s1').timeit(100000)
0.0186597650628606
>>> timeit.Timer("s2(10)", 'from __main__ import s2').timeit(100000)
0.018789616358585448
Что, по-видимому, показывает, что x * x
чуть-чуть быстрее в 100 000 итераций.
x*x
вместоx**2
, потому что это работает на всех языках, тогда какx**2
не работает в Java/C/C++. Поэтому я предполагаю, что причина в незнании большинства примеров. Мне любопытно узнать, есть ли разница в эффективности / числовая разница. - person Martin Thoma   schedule 17.10.2015