提高Python模块导入的速度
我有一个Python脚本,该脚本从磁盘加载3-D图像堆栈,对其进行平滑处理,然后将其显示为电影。当我想快速查看数据时,我从系统命令提示符下调用此脚本。我认为平滑数据需要700毫秒,因为这与MATLAB相当。但是,导入模块需要花费额外的650毫秒。因此,从用户的角度来看,Python代码以一半的速度运行。
这是我要导入的一系列模块:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import scipy.ndimage
import scipy.signal
import sys
import os
当然,并非所有模块的导入速度都一样慢。罪魁祸首是:
matplotlib.pyplot [300ms]
numpy [110ms]
scipy.signal [200ms]
我已经尝试过使用from
,但这并没有更快。由于Matplotlib是主要的罪魁祸首,并且因缓慢的屏幕更新而享有盛誉,因此我寻找了其他选择。一个是PyQtGraph,但是导入需要550毫秒。
我知道一个显而易见的解决方案,它是从交互式Python会话而不是系统命令提示符中调用函数。很好,但也很像MATLAB,我更喜欢从系统提示中使用我的函数的优雅方式。
我是Python的新手,现在不确定如何继续。由于我是新手,所以我很高兴看到有关如何实现建议的解决方案的链接。理想情况下,我正在寻找一个简单的解决方案(不是我们所有人!),因为代码需要在多台Mac和Linux机器之间可移植。
-
您可以构建一个简单的服务器/客户端,该服务器连续运行以制作和更新绘图,而客户端仅传达下一个要处理的文件。
我根据
socket
模块文档中的基本示例编写了一个简单的服务器/客户端示例:http
:
//docs.python.org/2/library/socket.html#example这是server.py:
# expensive imports import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import scipy.ndimage import scipy.signal import sys import os # Echo server program import socket HOST = '' # Symbolic name meaning all available interfaces PORT = 50007 # Arbitrary non-privileged port s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(1) while 1: conn, addr = s.accept() print 'Connected by', addr data = conn.recv(1024) if not data: break conn.sendall("PLOTTING:" + data) # update plot conn.close()
和client.py:
# Echo client program import socket import sys HOST = '' # The remote host PORT = 50007 # The same port as used by the server s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) s.sendall(sys.argv[1]) data = s.recv(1024) s.close() print 'Received', repr(data)
您只需运行服务器:
python server.py
进行导入,然后客户端仅通过套接字发送要绘制的新文件的文件名:
python client.py mytextfile.txt
然后服务器更新绘图。
在我的计算机上,运行导入需要0.6秒,而运行
client.py
0.03秒。