>> и / на языке питона - PullRequest
0 голосов
/ 25 марта 2012

В языке Python, есть ли разница между оператором '>>' и оператором '/' с точки зрения времени выполнения, когда мы собираемся делить любое целое число на кратное '2' и почему?

Ответы [ 4 ]

5 голосов
/ 25 марта 2012

Да, есть:

>>> timeit.timeit('a = 32; a / 2')
0.32588499376317426
>>> timeit.timeit('a = 32; a >> 1')
0.27532270162828

Причина, по-видимому, очевидна - операции с битами выполняются быстрее.

В любом случае, эта разница не является причиной для использования >> вместо / для деления.

3 голосов
/ 25 марта 2012

>> работает только на целые числа.Поведение / зависит от того, используете ли вы 2.x или 3.x (или импортировали division из __future__).Таким образом, важные различия не связаны со скоростью.

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

Реализация Python по умолчанию имеет настолько невероятные накладные расходы, что это неправильный язык, если вы заботитесь о таких вещах. Эти слайды из презентации Unladen Swallow довольно светлые ...

На самом деле >> будет быстрее, чем /.Но это не из-за стоимости деления, а из-за накладных расходов на выяснение, собираетесь ли вы делить число с плавающей точкой или целое число!Если вместо этого вы поделите на // (что предполагает int), это будет так же быстро, как >> ...

1 голос
/ 25 марта 2012

Ну, почти наверняка случается так, что битовый сдвиг быстрее, когда типы заранее не известны.Но мы можем быть умными.Давайте проверим:

In [11]: 2**20-37
Out[11]: 1048539

In [12]: timeit 1048539 >> 14
10000000 loops, best of 3: 29 ns per loop

In [13]: 2**14
Out[13]: 16384

In [14]: timeit 1048539 /16384
10000000 loops, best of 3: 72.2 ns per loop

In [15]: timeit 1048539 //16384
10000000 loops, best of 3: 29.1 ns per loop

Обратите внимание на последний случай: если мы специализируемся на целых числах с //, это почти точно так же!

Особенно в Python, где типы заранее не известны, иначе сложно оптимизировать подобные вещи.С другой стороны, это означает, что / будет работать и с нецелыми числами - что может быть ошибкой или функцией, в зависимости от того, что вы на самом деле делаете.

...