2012-02-19 51 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