2012-02-19 5 views
0

У меня есть код в python, который работает, но, к сожалению, очень медленный. Кто-то на #python предложил мне запустить код через профилировщик, чтобы увидеть строки и функции, в которых код занимал больше всего времени.ipython profiler

Исходный код python, который я хочу профилировать, читается из STDIN. Но поскольку вход большой, я скомпилировал ввод как файл, чтобы я мог просто перенаправить его на код python в оболочке. Таким образом, в оболочке, я выполняю команду ..

cat input | python pythonsource.py 

Проблема заключается в том, когда я пытаюсь запустить профайлер в IPython я не могу найти способ, чтобы перенаправить ввод в код питона. В IPython оболочки, я пытался,

run -p -l 1.0 pythonsource.py input (didn't work. simply waits at STDIN for input) 
run -p -l 1.0 pythonsource.py << input (didn't work) 
run -p -l 1.0 cat input | python pythonsource.py (didn't work.) 

Я не уверен, как это сделать, я могу сделать команду IPython профайлер перенаправить ввод в STDIN для pythonsource для чтения. Может кто-нибудь, пожалуйста, скажите мне, как это исправить? Или я совершенно не прав? Может быть, есть еще один более чистый, более умный способ профилирования кода python?

И, возможно, то, о чем я спрашиваю, должно быть частью другого вопроса .. но мне было интересно, что означает ipython, когда он ссылается на «примитивные вызовы» в некоторых выводах профилировщика ipython?

спасибо.

+0

насколько я знаю, трубопроводы в стандартном вводе несовместим с '% run' IPython в. Вам нужно будет выполнить профилирование вручную: http://docs.python.org/library/profile.html#instant-user-s-manual –

ответ

0

Правильный способ перенаправить ввод на в оболочке командную строку выглядит следующим образом:

cat input | run -p -l 1.0 python pythonsource.py 

run -p -l 1.0 python pythonsource.py < input 

Синтаксис << string создает «документ здесь», он не перенаправляет ввод.

из питона строки (и, надеюсь, в IPython), вы можете перенаправить стандартный ввод так:

import sys 
save_stdin = sys.stdin 
sys.stdin = open('input') 
run -p <etc.> 
sys.stdin = save_stdin # Restore the real stdin 

Или (рекомендуется) можно переписать ваш источник для работы с именем файла: Если вы называете это как следует, «вход» будет sys.argv[1], и вы можете открыть его и читать из него:

python pythonsource.py input 
+0

Я пробовал обе эти команды на оболочке ipython .. и ни одна из них не работала , Для первой команды я получаю 'sh: run: not found' ' cat: write error: Broken pipe', а второй просто ждет в приглашении ipython для большего ввода из STDIN. Я мог бы попробовать третий вариант, но я хотел знать, можно ли запустить профайлер на код python и его входной файл без изменения кода. – Jay

+0

Извините, я был невнимателен. Ваши попытки не работали бы в командной строке оболочки, поэтому я просто дал правильное использование. – alexis

+0

Спасибо, но я использовал метод -cProfile, упомянутый в ссылке, предложенной Томасом К. Кажется намного проще, и он работает прямо в командной строке без каких-либо изменений в источнике. – Jay