python求一个数的因子_在Python中查找数字的所有因子的最有效方法是什么?

通过检查奇偶校验,可以使任意奇数的运行时间缩短约50%。由于奇数的因子本身总是奇数,所以在处理奇数时没有必要检查它们。

我刚刚开始自己解决Project Euler谜题。在某些问题中,在两个嵌套for循环内部调用除数检查,因此该函数的性能至关重要。

将这一事实与agf优秀的解决方案相结合,我最终得到了这个功能:from math import sqrtdef factors(n):

step = 2 if n%2 else 1

return set(reduce(list.__add__,

([i, n//i] for i in range(1, int(sqrt(n))+1, step) if n % i == 0)))

但是,对于较小的数字(〜<100),此更改的额外开销可能会导致函数花费更长时间。

我跑了一些测试来检查速度。以下是使用的代码。为了产生不同的图,我相应地改变了X = range(1,100,1)。import timeitfrom math import sqrtfrom matplotlib.pyplot import plot, legend, showdef factors_1(n):

step = 2 if n%2 else 1

return set(reduce(list.__add__,

([i, n//i] for i in range(1, int(sqrt(n))+1, step) if n % i == 0)))def factors_2(n):

return set(reduce(list.__add__,

([i, n//i] for i in range(1, int(sqrt(n)) + 1) if n % i == 0)))X = range(1,100000,1000)Y = []for i in X:

f_1 = timeit.timeit('factors_1({})'.format(i), setup='from __main__ import factors_1', number=10000)

f_2 = timeit.timeit('factors_2({})'.format(i), setup='from __main__ import factors_2', number=10000)

Y.append(f_1/f_2)plot(X,Y, label='Running time with/without parity check')legend()show()

X =范围(1,100,1)

5acb3c8700013dc501600160.jpg

这里没有显着差异,但数字越大,优势显而易见:

X =范围(1,100000,1000)(仅奇数)

5acb3c8700013dc501600160.jpg

X =范围(2,100000,100)(仅偶数)

5acb3c8700013dc501600160.jpg

X =范围(1,100000,1001)(交替奇偶校验)

5acb3c8700013dc501600160.jpg

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值