On 9/20/2026 8:25 PM, Stefan Ram wrote:
"Johann \"Myrkraverk\" Oskarsson" <[email protected]> wrote or quoted:
       _BitScanForward( &index, *digits ) ;

   From the documentation:

|If no bit is found, the function returns 0 and the value
|written to the address in the first parameter is undefined.

   . However, if there are 32 0s before a 1 is found, this
   might be intended to add "32" to the total zero count.

   (GCC's and Clang's "__builtin_ctz" can also count bits and
   might be more portable.)

Newsgroups: comp.lang.python,comp.lang.c,sci.math
Followup-To: comp.lang.python,comp.lang.c

Dear Stefan,

You don't need to worry about _BitScanForward().  By the time that
function call happens, we are fairly certain there is a bit to find.
This is because we have already looped past all the zero digits [1],
and assume a real integer given to us from the outer Python runtime en-
vironment is not zero.  Otherwise, we simply assume the CPython runtime
to be buggy, and don't care about any of the results.

Perhaps I should have made that clearer in the code comments?

A bit more worrying is that I do not off hand know how to time my cre-
ation.  This is because /timeit/ can't find it.  I do not know why, and
hopefully the wizards of comp.lang.python can help benchmark this func-
tion against ( n & -n ).bit_length() - 1 # for some really long int-
egers.

See for instance this session in my recent history.

Python 3.13.15 (tags/v3.13.15:4061bc4, Aug 5 2026, 13:05:39) [MSC v.1944 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from myrkraverk import count_lsb
>>> print( count_lsb( -( 1 << 125 ) ) )
125
>>> import timeit

## From the above, we can see that my function works, and exists.  This
## also demonstrates that it totally ignores the sign bit.  What follows
## is confounding.

>>> timeit.timeit( "count_lsb( 1 << 125 )" )
Traceback (most recent call last):
  File "<python-input-7>", line 1, in <module>
    timeit.timeit( "count_lsb( 1 << 125 )" )
    ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Opt\Python\3.13\Lib\timeit.py", line 237, in timeit
    return Timer(stmt, setup, timer, globals).timeit(number)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "C:\Opt\Python\3.13\Lib\timeit.py", line 180, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
NameError: name 'count_lsb' is not defined

Why doesn't /timeit/ see my C extension function?


Best wishes, and happy Python benchmarking!

[1] Here, /digit/ is the 30bit word the internal CPython interpreter
uses to represent multiprecision integers.
--
Johann | email: invalid -> com | http://www.myrkraverk.com/blog/
I'm not from the Internet, I just work there. | via Easynews.com
https://bsky.app/profile/myrkraverk.bsky.social | for ( ;; ) _:;
--
https://mail.python.org/mailman3//lists/python-list.python.org

Reply via email to