我正在尝试编写超快速析因函数的代码。我已经尝试了一点,已经提出了以下三个候选人(除了math.factorial):Python - 快速析因函数
def f1():
return reduce(lambda x,y : x * y, xrange(1,31))
def f2():
result = 1
result *= 2
result *= 3
result *= 4
result *= 5
result *= 6
result *= 7
result *= 8
#and so-on...
result *= 28
result *= 29
result *= 30
return result
def f3():
return 1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22*23*24*25*26*27*28*29*30
我已超时这些功能。这些是结果:
In [109]: timeit f1()
100000 loops, best of 3: 11.9 µs per loop
In [110]: timeit f2()
100000 loops, best of 3: 5.05 µs per loop
In [111]: timeit f3()
10000000 loops, best of 3: 143 ns per loop
In [112]: timeit math.factorial(30)
1000000 loops, best of 3: 2.11 µs per loop
很明显,f3()取了蛋糕。我试图实现这一点。详细地说,我试过写代码来产生这样的字符串: “1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 ..... ...“然后使用eval来评估这个字符串。 (承认'eval'是邪恶的)。但是,这种方法在时间上并没有给我带来任何收益。事实上,我花了近150微秒才完成。
请教如何推广f3()。
我不认为你可以概括F3。这个练习展示的是,如果你想找到最快的方法来做某件事,你需要测试实际的事情。仅适用于n = 30的测试功能无济于事。无论如何,最后,尝试使用'reduce'与'operator.mul'。或者,如果您可以保证参数不会超过〜1000,只需将结果缓存在列表中。 –
@AlexHall我实际上已经尝试减少(运算符.__ mul__,....)但是,结果不是纳秒范围,这正是我所希望的。 –