2015-07-28 4 views
-1

Мой вопрос очень прост. У меня есть питон простой код, как это:Как ускорить прогресс цикла в Python?

for i in range(1,1193616,1) : 
     print i 

Таким образом, все числа в диапазоне от 1 до 1193616 будет распечатана и этот цикл прогресс занимает очень много времени .. Как сделать это быстро?

EDIT:

на самом деле, я пытаюсь сделать программу A-звезда Pathfinding для данных изображения (растр) .. Это мой A-звезда функция сценария до сих пор:

def A_star(h,c,dx,dy,u,s_id,e_id,Op,Cl,Prt,CC,o,ht,w): 
    Op.append(s_id) 
    while e_id not in Op : 
     if Op == [ ] : 
      break 
     candidate = { } 
     for i in Op : 
      d = {i : CC[i]} 
      candidate.update(d) 
     o = min(candidate, key=candidate.get) 
     Cl.append(o) 
     Op.remove(o) 
     adjacent_list = adjacent_cell(o,dx,dy) 
     for p in adjacent_list : 
      if p in Cl:  
       adjacent_list = filter(lambda i: i != p, adjacent_list)  
      elif p not in Op : 
       Op.append(p) 
       d = {p : o } 
       Prt.update(d) 
       d = {p : F(p,o,h,u,w,c,dx,e_id,ht,CC)} 
       CC.update(d) 
      elif id in Op : 
       f1 = F(p,o,h,u,w,c,dx,e_id,ht,CC) 
       f2 = F(p,Prt[p],h,u,w,c,dx,e_id,ht,CC) 
       if f1 < f2 : 
        d = {p : o } 
        Prt.update(d) 
        d = {id : F(p,o,h,u,w,c,dx,e_id,ht,CC)} 
        CC.update(d) 
    return Prt 

предполагается что s_id = 1 (старт) и e_id = 1193616 (конец), длительный цикл завершен в строке 3 while e_id not in Op : Есть ли способ ускорить или оптимизировать мой код?

+5

Я уверен, что печать - это бутылочная шея. Попробуйте только поставить 'pass' в качестве тела цикла и распечатать, как только цикл закончен. Должно быть намного быстрее. –

+0

Возможный дубликат [Почему печать на stdout так медленно? Можно ли его ускорить?] (Http://stackoverflow.com/questions/3857052/why-is-printing-to-stdout-so-slow-can-it-be-sped-up) – Stiffo

+0

Это не цикл, он пишет небуферизованный текст на консоль. – Stiffo

ответ

6

Обычно медленный выход, а не цикл; вы могли бы сделать:

print '\n'.join('%s' % c for c in range(1, 1193616)) 

Edit:

В моей системе, когда вывод на терминал, код принял 10.193s, и моя версия 2.374s. Если он перенаправлен в файл, то он равен 0,486s против 0,572s (это не большая разница).

Примечание. Это не всегда лучшее решение для «буферизации» всех данных в вашей программе, прежде чем записывать их за один раз (вы можете исчерпать ресурсы памяти), и я сомневаюсь, что полезно печатать на терминале больше, чем сотни строк ...

1

Сам цикл довольно эффективен, на самом деле это утверждение «print», которое вызывает накладные расходы. Например, замените печать на переменное присваивание, и вы увидите разницу. Кроме того, стоит упомянуть, что ваш «дальний» вызов можно упростить до диапазона (1193616)

+1

или даже 'xrange', если вы действительно ищете повышение производительности –

+1

или даже используете python 3 и делаете с ним ;) – mephisto

1

Вместо того, чтобы печатать числа на каждой итерации, присоединяйте их и распечатайте один раз, но с str.join принимайте строковые объекты, вы можете преобразовать их в строку по применяя функцию str на его номер с использованием функции map:

print '\n'.join((map(str,range(1,1193616)))) 
1

с проблемой определено, что путь существует не так много вы можете сделать. Большая оптимизация включает в себя сокращение объема работы, выполняемой процессором. Это может означать настройку данных таким образом, чтобы их было меньше.

Например, если вы уменьшили количество итераций наполовину, это будет быстрее! Если это не может быть изменено, то вы не можете много сделать.

В противном случае измените выполняемые операции. В этом случае измените оператор 'print' на 'pass'. Конечно, результат будет не таким.

Если вы используете Python 2, то range() фактически распределяет список, выделяет числовые объекты и заполняет список до того, как ваш цикл даже начнется. Python 3 возвращает итератор, который позволяет избежать выделения и инициализации памяти и, следовательно, быстрее. (Python 2 имеет функцию xrange(), которая работает так, но вам все равно лучше использовать Python 3)

Обычно оптимизируемый код намного сложнее.Он может включать функции вызова, работающие над списками, строками или другими структурами данных. Поэтому решения должны понимать предполагаемый результат и как достичь этого результата при меньших затратах. Сравните это с поездкой в ​​магазин. Вы можете ездить по всему городу, останавливаться на каждом освещении, который вы можете пройти, и проходить через каждый район, или вы можете пойти прямо вокруг квартала в ближайший магазин. Один из них «оптимизирован», хотя оба «работают».

0

Как было упомянуто выше, Xrange должен быть немного быстрее, например. для i в xrange (n): сделайте что-нибудь. Что должна делать ваша программа?

Смежные вопросы