1

最近、Pythonでプロジェクトオイラーの問題を実行しようとしました。それは100^5ステップのようなことをするだろうというのが私の信念でした。

私のソリューションが時間がかかりすぎることを確認した後(1分以内に実行されるはずです)、これほど多くのステップを実行したPythonプログラムが実行可能かどうかを自問しました(1分未満)

だから、私は愚かな小さなテストを設計しました

def fun():
  l=range(1,100)
  for x in l:
     for y in l:
        for k in l:
           for n in l:
               for h in l:
                  s=1

>>> t = timeit.Timer('demorado.fun()','import demorado')
>>> t.timeit(1)
1202.484529018402
>>>

意味がありますか?これだけ多くのステップがあるプログラム(この場合、2 *(100 ^ 5)があると思います)は常に約20分かかることを証明していますか?

4

5 に答える 5

2

Project Euler の問題は、プログラミング言語が十分に高速であるため、1 分未満で実行されるとは想定されていませんが、単なる力ずくよりも賢い解決策が存在するためです。

しかし、あなたの場合、はい、ループする関数を取得します( is では99^5ない100^5ため)...range(1,100)1, 2, ..., 99

于 2012-07-22T22:02:45.337 に答える
2

それがあなたが望むことをしているかどうかはわかりませんが、それは合理的な仮定です。実際には、これはもっと近いかもしれません:

for i in xrange(100 ** 5): pass
于 2012-07-22T22:05:28.607 に答える
1

Python の場合は、おそらく適切な見積もりです。numpy または C++ 拡張機能を使用すると、Project Euler コードが高速化される可能性がありますが、Project Euler のすべての問題は 1 分未満で解決できるように設計されていることを忘れないでください。正しい解にたどり着くために 100^5 の操作を実行する必要があることはほとんどありません。私があなただったら、別の角度から問題にアプローチしようとします.

于 2012-07-22T22:06:26.863 に答える
1

これほど多くのステップを含むプログラムでは、常に約 20 分かかることが証明されるでしょうか?

「ステップ」の定義によって異なります。次のコードは、約 99^5 の浮動小数点演算を必要としますが、約 1 秒で実行されます。

import numpy as np
a = np.zeros(shape=(1681, 1681), dtype=np.float32) # 1681 x 1681 matrix
b = np.dot(a, a) # matrix product
于 2012-07-22T22:09:57.863 に答える
0

内側のループのpass代わりに試してください。s=1

また、numpy.nditer「external_loop」オプションを使用するか、ループがボトルネックであることが判明した場合は、Cython でループを記述します。

于 2012-07-22T22:02:36.007 に答える