2011-08-21 12 views
7

Así que estoy teniendo un pequeño problema lidiando con bucles en Python; por lo que yo sé, se vuelven más lentos con el tiempo. Estoy recorriendo un rango dentro de un rango y, a medida que pasa el tiempo, el ciclo disminuye notablemente. Esto se hace dentro de un motor de juego, si es que importa. ¿Alguien podría decirme cuál es el problema?Python for Loop se ralentiza con el tiempo

Aquí hay un ejemplo rápido.

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) 

La velocidad inicial de este proceso es buena, pero con el tiempo el ciclo se ralentiza. Sé que no es nada más que el Rasterizer del motor del juego porque cuando termina el ciclo, el resto del motor funciona a 60 FPS. Entonces, ¿Cuál podría ser el problema?

EDITAR: Estoy usando Python 3, por lo que no hay xrange.

EDIT 2: Para este ejemplo, vs es 1,0, y los valores de tamaño predeterminados de xs, ys, y zs son todos 20.

+5

¿Qué tan grandes son sus tres parámetros de bucle, xs, ys y zs? –

+0

¿Qué pasa si comenta alguna de las dos líneas dentro de los bucles? – jtbandes

+0

Si está usando python 2.x 'xrange' será más rápido que' range' – GWW

Respuesta

13

Este es otro caso de "necesita más información". Sin embargo, Python tiene una forma estándar de la construcción de bucles anidados como esto de manera eficiente, itertools.product:

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) 

No requiere la construcción de range s cada vez que en el bucle interno. También cambié tu uso de range a xrange, ya que es mejor para rangos grandes, aunque esto es realmente irrelevante con product.

@ La pregunta de JohnZ es buena: si sus "valores de tamaño predeterminados" son muy grandes, y especialmente si vs también es grande, podría estar construyendo valores grandes, y podría tomar mucho tiempo para que Cube procese ellos.

Dudo que el bucle en sí se esté desacelerando, pero los números son cada vez más grandes, por lo que sus cálculos podrían ser.

+0

vs es actualmente 1.0. – SolarLune

+0

Además, mis 'valores de tamaño predeterminados' son, para este ejemplo, 20 cada uno. – SolarLune

+0

Pero eso es lo raro: el bucle for debería mantenerse a una velocidad estable, ¿no es así? Definitivamente se está volviendo más lento con el tiempo hasta cierto punto ... – SolarLune

1

Tres cosas que se me ocurren:

memoria - si está almacenando todos los valores generados en algún lugar, el bucle podrían estar disminuyendo debido a que el de toda la memoria que se utiliza. Python tiene su propio administrador de memoria, por lo que consumir mucha memoria podría hacer que el programa sea más lento.

Complejidad de los cálculos: Python utiliza tipos de datos numéricos de precisión arbitraria. Si está multiplicando números extremadamente grandes juntos (especialmente flotadores), el programa se ralentizará. Realmente depende de qué tan grandes sean estos valores.

Cubo - Podría ser un error en el código del Cubo (aunque estoy seguro de que es probablemente tan simple como parece).