Python для замедления цикла со временем - PullRequest
8 голосов
/ 21 августа 2011

Так что у меня возникли небольшие проблемы с циклами for в Python - насколько я могу судить, они со временем замедляются.Я зацикливаюсь на диапазоне внутри диапазона, и со временем цикл заметно замедляется.Это делается внутри игрового движка, если это имеет значение.Может кто-нибудь сказать мне, в чем проблема?

Вот краткий пример.

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)

Начальная скорость этого процесса в порядке, но со временем цикл замедляется.Я знаю, что это не что иное, как Rasterizer игрового движка, потому что, когда цикл завершен, остальная часть движка работает на скорости 60 FPS.Итак, в чем может быть проблема?

РЕДАКТИРОВАТЬ: я использую Python 3, поэтому нет xrange.

РЕДАКТИРОВАТЬ 2: Для этого примера, vs равен 1,0, и предопределенные значения размераxs, ys и zs - все 20.

Ответы [ 2 ]

15 голосов
/ 21 августа 2011

Это еще один случай "нужна дополнительная информация".Однако в Python есть стандартный способ эффективного создания таких вложенных циклов: 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)

. Он не требует построения range s каждый раз ввнутренний циклЯ также переключил ваше использование range на xrange, так как оно лучше для больших диапазонов, хотя это действительно не имеет отношения к product.

@ Вопрос JohnZ хорош - если ваши "предопределенные значения размера"очень велики, и, особенно, если vs также велико, вы могли бы создать некоторые большие значения, и Cube может потребоваться много времени для их обработки.

Я сомневаюсь в самом циклезамедляется, но цифры становятся больше, поэтому ваши расчеты могут быть.

1 голос
/ 21 августа 2011

Три вещи, о которых я могу думать:

Память - если вы где-то храните все сгенерированные значения, цикл может замедляться из-за использования всей памяти.В Python есть собственный менеджер памяти, поэтому использование большого количества памяти может в конечном итоге замедлить работу программы.

Сложность вычислений - Python использует числовые типы данных произвольной точности.Если вы умножаете очень большие числа вместе (особенно с плавающей точкой), программа замедлится.Это действительно зависит от того, насколько велики эти значения.

Cube - Это может быть ошибка в коде Cube (хотя я уверен, что это, вероятно, так же просто, как кажется).

...