超高速階乗関数のコードを記述しようとしています。私は少し実験してきたし、(離れて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」は悪いことを認めます)。しかし、この方法では、時間的に利益が得られませんでした。実際には、完了までに約150マイクロ秒かかりました。
f3()を一般化する方法について助言してください。
私はあなたがF3を一般化することができないと思うだろうことになります。この演習で示されていることは、何かをする最速の方法を見つけたい場合は、実際のものをテストする必要があるということです。 n = 30でしか動作しないテスト機能は役に立ちません。とにかく、最後に 'reduce'を' operator.mul'で試してみてください。または、パラメータが〜1000より大きくならないことを保証できる場合は、結果をリストにキャッシュするだけです。 –
@AlexHall私は実際にreduce(operator .__ mul__、....)を試みましたが、結果はナノ秒の範囲ではありませんでした。これは私が望んでいたものです。 –