代码之家  ›  专栏  ›  技术社区  ›  Jihyun

平分对分_right()比我的快3~4倍

  •  0
  • Jihyun  · 技术社区  · 3 年前

    我把我的对分写对了()。它比平分慢3倍。对分_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 
    

    我创建了一个包含10M个整数的列表,并对其运行了bisect_right()。 二等分。对分右()花了24.82秒,而我的对分右()花了76.30秒。 请让我知道我做错了什么。。。

    0 回复  |  直到 3 年前
        1
  •  5
  •   wjandrea Erik Kaplun    3 年前

    假设你用的是CPython和 _bisect 是可用的,最大的区别是 bisect.bisect_right() 在C中实现。请参阅 these lines in bisect.py :

    # Overwrite above definitions with a fast C implementation
    try:
        from _bisect import *
    except ImportError:
        pass
    

    作为参考,您可以轻松检查函数的repr是用Python还是用C实现的:

    >>> import bisect
    >>> bisect.bisect_right  # C
    <built-in function bisect_right>
    >>> import functools
    >>> functools.wraps  # Python
    <function wraps at 0x000001DDAB175F70>