2011-08-21 11 views
7

私はPythonでforループを扱うのに少し問題があります。私が言うことができる限り、時間の経過とともに遅くなっています。私は範囲内の範囲をループしています。時間が経過すると、ループが著しく遅くなります。これは重要な場合は、ゲームエンジンの内部で行われます。誰が問題が何であるか教えてもらえますか?Python for Loop時間が遅い

ここに簡単な例があります。

for x in range(xs): # xs, ys, and zs are all pre-determined size values 

    for z in range(zs): 

      for y in range(ys): 

       vp = [x * vs, y * vs, z * vs] 

       v = Cube(vp) 

このプロセスの初期速度は問題ありませんが、時間とともにループは遅くなります。ループが終了すると残りのエンジンは60FPSで動作するため、ゲームエンジンのラスタライザのようなものではありません。では、何が問題になるのでしょうか?

編集:私はPython 3を使用しているので、xrangeはありません。

EDIT 2:この例では、対1.0であり、XS、YS、ZSとの所定の大きさの値は全て20

+5

3つのループパラメータxs、ys、zの大きさはどれくらいですか? –

+0

ループ内の2行のいずれかをコメントアウトするとどうなりますか? – jtbandes

+0

Python 2.xの 'xrange'を使うと' range'よりも速くなります – GWW

答えて

13

である。これは、「より多くの情報が必要」の他の場合です。

from itertools import product 

for x, y, z in product(xrange(xs), xrange(zs), xrange(ys)): 
    vp = [x * vs, y * vs, z * vs] 
    v = Cube(vp) 

これは、内側のループでrange秒毎回の構築を必要としない。しかし、Pythonはitertools.product、この効率のようなネストされたループを構築するための標準的な方法があります。私はまたrangeの使用をxrangeに変更しました。これは大きな範囲ではより良いので、実際にはproductとは関係ありません。

JohnZの質問が良いです@ - あなたの「所定のサイズの値が」非常に大きく、vsも大きい場合は特に、あなたには、いくつかの大きな値を構築することができ、それがプロセスにCubeのために長い時間を割いてすることができればそれら。

私はループ自体が減速しているとは思っていませんが、数値が大きくなっているため、計算が行われている可能性があります。私は考えることができる

+0

vsは実際には1.0です。 – SolarLune

+0

また、私の '所定のサイズ値'は、この例では、それぞれ20です。 – SolarLune

+0

しかし、それは奇妙なことです - forループは安定した速度にとどまるべきでしょうか?それは間違いなく時間の点で一段と遅くなっています... – SolarLune

1

3つのこと:

メモリ - すべてのメモリの使用されているので、あなたがどこかで発生したすべての値を保存している場合は、ループが減速されることがあります。 Pythonは独自のメモリマネージャを持っているので、大量のメモリを使用すると、最終的にはプログラムが遅くなる可能性があります。

計算の複雑さ - Pythonは任意の精度の数値データ型を使用します。極端に大きな数値(特に浮動小数点数)を掛け合わせると、プログラムが遅くなります。これらの値がどれだけ大きくなるかは、実際には大きく異なります。

キューブ - キューブコードのバグである可能性があります(おそらく、それはおそらく同じくらい簡単です)。