2012-02-19 54 views
0

我有一些代碼在python的工作,但不幸的是超級慢。 #python的人建議我可以通過分析器運行代碼,以查看代碼花費最多時間的行和函數。ipython profiler

我想要配置文件的python源代碼從STDIN中讀取。但是由於輸入很大,我將輸入編譯爲一個文件,以便我可以簡單地將它重定向到shell中的python代碼。因此,在殼,我發出命令..

cat input | python pythonsource.py 

的問題是,當我嘗試運行IPython的剖析,我似乎無法找到一種方法來重定向輸入到Python代碼。在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

據我所知,在管道標準輸入是IPython中的'%run'不兼容。你將不得不手動運行分析:http://docs.python.org/library/profile.html#instant-user-s-manual – 2012-02-19 14:14:23

回答

0

重定向輸入上外殼命令行正確的做法是:

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

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

語法<< string創建「這裏文件」,它不重定向輸入。

從Python提示符(並希望在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 shell上的這兩個命令..並且它們都沒有工作。對於第一個命令,我得到'sh:run:not found' 'cat:寫入錯誤:斷開的管道,第二個命令只是在ipython提示符下等待來自STDIN的更多輸入。我可以嘗試第三種方法,但我想知道是否可以在不修改代碼的情況下在python代碼及其輸入文件上運行profiler。 – Jay 2012-02-19 09:47:26

+0

對不起,我是粗心的。你的嘗試不會在shell命令行上起作用,所以我只是給出了正確的用法。 – alexis 2012-02-19 10:50:44

+0

謝謝,但是我使用了Thomas K.提出的鏈接中提到的-cProfile方法。它似乎更簡單,它可以在命令行上正常工作,無需對源進行任何修改。 – Jay 2012-02-20 22:47:30