python求2的10次方_在Python中找到大于n的2的最小幂

在Python中返回大于或等于给定非负整数的2的最小幂的最简单函数是什么?

例如,2的最大幂大于或等于6是8.

解决方法:

我们来测试一下:

import collections

import math

import timeit

def power_bit_length(x):

return 2**(x-1).bit_length()

def shift_bit_length(x):

return 1<

def power_log(x):

return 2**(math.ceil(math.log(x, 2)))

def test(f):

collections.deque((f(i) for i in range(1, 1000001)), maxlen=0)

def timetest(f):

print('{}: {}'.format(timeit.timeit(lambda: test(f), number=10),

f.__name__))

timetest(power_bit_length)

timetest(shift_bit_length)

timetest(power_log)

我使用范围(1,1000001)而不仅仅是范围(1000000)的原因是power_log版本将在0上失败.我之所以在较大范围内使用少量代表而不是大量代表的原因小范围是因为我希望不同的版本在不同的域上具有不同的性能. (如果你希望用巨大的千位数来调用它,当然,你需要一个使用它的测试.)

使用Apple Python 2.7.2:

4.38817000389: power_bit_length

3.69475698471: shift_bit_length

7.91623902321: power_log

使用Python.org Python 3.3.0:

6.566169916652143: power_bit_length

3.098236607853323: shift_bit_length

9.982460380066186: power_log

使用pypy 1.9.0 / 2.7.2:

2.8580930233: power_bit_length

2.49524712563: shift_bit_length

3.4371240139: power_log

我相信这表明2 **在这里是缓慢的部分;使用bit_length而不是log确实加快了速度,但是使用1<

此外,我认为它更清楚. OP的版本要求你进行心理上下文 – 从对数切换到位,然后再转换为指数.要么始终保持位(shift_bit_length),要么留在日志和指数(power_log)中.

标签:python


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部