#python
Вопрос:
Я написал свой bisect_right(). Это в 3 раза медленнее, чем bisect.bisect_right().
def my_bisect_right(a, num):
ok = len(a)
ng = -1
while abs(ok - ng) > 1:
mid = (ok ng) // 2
if a[mid] <= num:
ng = mid
else:
ok = mid
return ok
Я создал список из 10 миллионов целых чисел и запустил bisect_right() против него.
Bisect.bisect_right() занял 24,82 секунды, в то время как my_bisect_right() занял 76,30 секунды.
Пожалуйста, дайте мне знать, что я делаю не так…
Комментарии:
1. вероятно
abs()
, в вашем состоянии в то время, как они мало чем отличаются друг от друга — github.com/python/cpython/blob/…2. Спасибо. после удаления abs () я получил 58,23 секунды в том же списке размеров.
3.
bisect
Написан ли модуль на Python или C?4. Сколько раз вы публиковали отдельные испытания или они усреднены по нескольким испытаниям?
5. усредненный. как я могу узнать, написан ли модуль bisect на Python или C? Я думал, что это написано на Python…
Ответ №1:
Предполагая, что вы используете CPython и _bisect
он доступен, самая большая разница заключается в том, что bisect.bisect_right()
реализован в C. Смотрите эти строки в bisect.py
:
# Overwrite above definitions with a fast C implementation
try:
from _bisect import *
except ImportError:
pass
Для справки, вы можете легко проверить, реализована ли функция на Python или C, по ее повторению:
>>> import bisect
>>> bisect.bisect_right # C
<built-in function bisect_right>
>>> import functools
>>> functools.wraps # Python
<function wraps at 0x000001DDAB175F70>