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

我们来测试一下:import collections

import math

import timeit

def power_bit_length(x):

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

def shift_bit_length(x):

return 1<<(x-1).bit_length()

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)

我使用range(1, 1000001)而不仅仅是range(1000000)的原因是power_log版本将在0上失败。我之所以在一个大范围内使用少量的rep,而不是在一个小范围内使用大量的rep,是因为我希望不同的版本在不同的域上有不同的性能。(当然,如果您希望使用大量的千位数字来调用它,那么您需要一个使用这些数字的测试。)

使用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<<而不是2**更重要。

而且,我觉得更清楚。OP的版本要求您将一个心理上下文从对数切换到位,然后再返回到指数。要么一直保持位(shift_bit_length),要么保持日志和指数(power_log)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值