慢ipython --pylab和ipython笔记本启动

时间:2013-09-29 09:35:56

标签: python performance ipython

我已经从ipython 0.10切换到1.1.0。现在,我正在经历令人烦恼的启动过程缓慢下降。

虽然ipython单独仍在使用,ipython --pylab启动速度非常慢,即~8 secs(在英特尔(R)酷睿2双核CPU P9500上) 2.53GHz系统),尤其是我在ipython 0.10中没有的新ipython notebook,即~12 secs

当我strace -o tessi.txt -tt ipython --pylab时,我至少可以识别出似乎对这些延迟的大块负责的部分。任何摆脱这些的帮助都会非常受欢迎。

对于--pylab选项,strace的输出包含一个吃掉~5 secs的部分,并且在启动ipython时不存在,即

10:23:24.331968 stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=868, ...}) = 0
10:23:24.332028 socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 9
10:23:24.332074 connect(9, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = 0
10:23:24.332152 sendto(9, "\2\0\0\0\4\0\0\0\35\0\0\0MYHOST.DOM.AIN."..., 41, MSG_NOSIGNAL, NULL, 0) = 41
!! -> 10:23:24.332227 poll([{fd=9, events=POLLIN|POLLERR|POLLHUP}], 1, 5000) = 1 ([{fd=9, revents=POLLIN|POLLHUP}])
!! -> 10:23:29.336301 read(9, "\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 32) = 32
10:23:29.336533 close(9)                = 0
10:23:29.336839 close(7)                = 0

我用MYHOST.DOM.AIN

替换了我的实际主机名

ipython notebook的情况下,似乎基本上有两个这样的区域。第一个似乎与ipython --pylab相同。第二个带走另一个~4 secs

10:39:31.823298 stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=868, ...}) = 0
10:39:31.823358 socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 9
10:39:31.823405 connect(9, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = 0
10:39:31.823499 sendto(9, "\2\0\0\0\4\0\0\0\35\0\0\0MYHOST.DOM.AIN."..., 41, MSG_NOSIGNAL, NULL, 0) = 41
!! -> 10:39:31.824166 poll([{fd=9, events=POLLIN|POLLERR|POLLHUP}], 1, 5000) = 1 ([{fd=9, revents=POLLIN|POLLHUP}])
!! -> 10:39:36.827298 read(9, "\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 32) = 32
10:39:36.827503 close(9)                = 0
10:39:36.827828 close(7)                = 0    

10:39:38.591774 setsockopt(6, SOL_TCP, TCP_NODELAY, [0], 4) = 0
10:39:38.591922 poll([{fd=3, events=POLLIN}, {fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}], 4, 0) = 0 (Timeout)
10:39:38.592007 poll([{fd=3, events=POLLIN}, {fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}], 4, 0) = 0 (Timeout)
!! -> 10:39:38.592049 poll([{fd=3, events=POLLIN}, {fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}], 4, 3600000) = ? ERESTART_RESTARTBLOCK (To be restarted)
!! -> 10:39:42.355658 --- SIGINT (Interrupt) @ 0 (0) ---
10:39:42.355773 write(5, "\0", 1)       = 1
10:39:42.355916 rt_sigreturn(0x2)       = -1 EINTR (Interrupted system call)
10:39:42.356113 rt_sigaction(SIGINT, {0x7f26dc0fbfc6, [], SA_RESTORER, 0x7f26dbe5a2d0}, {0x7f26dc0fbfc6, [], SA_RESTORER, 0x7f26dbe5a2d0}, 8) = 0
10:39:42.356672 clone(child_stack=0x7f26cfb49ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f26cfb4a9d0, tls=0x7f26cfb4a700, child_tidptr=0x7f26cfb4a9d0) = 11084

欢迎任何有关如何摆脱这些延误的帮助。

最后,当我在它的时候。当我看到strace的剩余输出时,我看到,在启动时,ipython尝试打开很多“python相关”文件,我会天真地认为它应该永远不会这样做,而且我的系统python绝对不是安装?所有这些开放的呼叫都失败了。 E.g:

11:11:26.465594 open("/opt/intel/composerxe-2011.3.174/compiler/lib/intel64/tls/libpython2.7.so.1.0", O_RDONLY) = -1 ENOENT (No such file or directory)
11:11:26.465646 stat("/opt/intel/composerxe-2011.3.174/compiler/lib/intel64/tls", 0x7fff0efb0100) = -1 ENOENT (No such file or directory)

or

11:11:26.468293 stat("/usr/local/lib/vtk-5.4/tls/x86_64", 0x7fff0efb0100) = -1 ENOENT (No such file or directory)
11:11:26.468347 open("/usr/local/lib/vtk-5.4/tls/libpython2.7.so.1.0", O_RDONLY) = -1 ENOENT (No such file or directory)

这些调用的总时间占剩余慢启动的另一个重要部分,但我无法指向特定的时间段。知道如何减少这些电话吗?

2 个答案:

答案 0 :(得分:2)

1)我建议不要从--pylab开始,我们鼓励人们在启动后使用%matplotlib。使用--pylab时开始的开销很可能是由于导入了我们无法访问的软件包。 ArchLinux上有一些错误,其中每个ipython --pylab占用数百MB,因为内存泄漏的地方不在IPython代码中。

对套接字的访问仍然看起来很奇怪,要确切了解它的来源可能会有所帮助。

2)带笔记本的第二个可能是由于ZMQ以及在localhost上通过套接字进行的一些通信的开始。我们知道在某些情况下它可能需要一些时间,但我们还需要找出代码的哪一部分很慢。 NOtebook还启动了一个网络服务器,因此可以进行网络操作。

3)可能是由于我们使用的某些库,我们不会在ipython中明确地打开这样的tings。特别是VTK。你有一个加载特定事物的个人资料吗?

您可以尝试在IPython跟踪器上打开一个问题,但我们可能会要求您深入了解ipython中需要花费大量时间的python调用。核心开发人员之间已经提出了启动时间的问题。

大家一致认为这将是“尽力而为”,但我们绝对不会将此作为优先事项。与vbech等跟踪回归的工具集成仍然很好,如果有人有动力去慢速调用,我们会很乐意尽力改进。

答案 1 :(得分:0)

有关此问题的其余部分,请参阅https://github.com/ipython/ipython/issues/4298