2011-12-14 3 views
0

Интересно, есть ли какие-нибудь инструменты для оптимизации моей программы в процессе разворачивания цикла и как ее использовать?инструмент оптимизации

У меня есть следующий код Python:

for i in range(0, 1000): 
     a = a * 10 + a%4 + i 
for j in range(0, 1000): 
     j = j + a 
for b in range(0, 1000): 
     result = j + b 

Я хочу, чтобы оптимизировать этот сегмент кода, так что я могу попытаться понять цикл развернув немного. С Python я хочу знать оптимизатор C.

+1

Ваш код не работает ('a' не определен). Сначала заставьте его работать, а затем оптимизируйте. – eumiro

+0

Я просто попытался показать сегмент кода, не все. Если вы хотите добавить a = 30 –

+1

Второй цикл можно заменить на 'j = a + 999'. Третий - с результатом 'result = j + 999'. –

ответ

4
a = 30 
for i in range (0,1000) : 
    a = a * 10 + a%4 + i 

можно переписать в виде:

a = reduce(lambda a,b: a * 10 + a%4 + b, xrange(1000), 30) 

занимает примерно в то же время (~ 4 мс на моем компьютере).


for j in range (0, 1000) : 
     j = j + a 

не имеет особого смысла. Вы делаете итерацию j за 0-999, и каждый раз добавляете к ней огромный a, потому что следующий j снят. Его можно переписать в виде:

j = 999 + a 

for b in range (0 , 1000) : 
     result = j + b 

не имеет особого смысла тоже. Это эквивалентно:

result = j + 999 
2

Там существует научный доклад о воздействии петли разворачивания в Python (pdf link). These - слайды соответствующих разговоров.

Однако, с точки зрения оптимизации автоматического кода C вы можете использовать LLVM в сочетании с LooPo и, возможно, Polly. В любом случае, LLVM - хорошая отправная точка.

+0

CAn вы приводите пример, как его использовать (llvm) –

+0

Это руководство по курсу: используйте LLVM для генерации байт-кода из вашего C-кода (например, с помощью 'clang -emit-llvm -c foo.c -o foo.o') и использовать один или несколько из [этих] (http://llvm.org/docs/Passes.html) преобразований. Результатом является снова считываемый байт-код или даже графики (созданные с помощью Graphviz). Вы можете попробовать, но вам придется потратить некоторое время и не ожидать чудес;) –

+0

Я искал этот файл в формате .deb, но я не мог найти файл в пакете ubuntu. Вы использовали их в ubuntu –

3

Если вас не устраивает производительность вашего кода, профилируйте его и обнаружите, что низкоуровневые петли, подобные этому, являются узким местом, вы должны быть способны быстро ускорить ваш код, используя cython, чтобы включить дорогие биты кода в расширения C. Кроме того, если вы используете python 2.x, вы должны использовать xrange вместо range.

+0

вы можете привести пример, как я могу его использовать (cython) –

+0

Официальная документация очень хорошая. Посмотрите [начало работы] (http://docs.cython.org/src/quickstart/index.html) для инструкций по установке cython, построение кода cython (использование 'pyximport' является самым простым способом), вызывая его из python и ускоряя код с использованием объявлений статического типа. Инструкции для pyximport [здесь] (http://docs.cython.org/src/userguide/source_files_and_compilation.html#compilation). – James

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