关于如何加速Python模块导入的问题以前已经被提出(Speeding up the python "import" loader和Python -- Speed Up Imports?),但没有具体的例子,也没有产生公认的解决方案。因此,我将在这里再次讨论这个问题,但这一次是一个具体的例子。
我有一个Python脚本,它从磁盘加载一个3-D图像堆栈,对其进行平滑处理,并将其显示为电影。当我想要快速查看数据时,我从系统命令提示符调用此脚本。我可以用700ms来平滑数据,因为这可以与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,但它需要550ms才能导入。
我知道一个显而易见的解决方案,那就是从交互式Python会话调用我的函数,而不是从系统命令提示符调用。这很好,但它太像MATLAB了,我更喜欢在系统提示符下使用函数的优雅。
我是Python的新手,目前我不确定该如何继续。由于我是新人,我希望获得有关如何实现所提出的解决方案的链接。理想情况下,我正在寻找一个简单的解决方案(我们不都是这样吗?)因为代码需要在多台Mac和Linux机器之间移植。
发布于 2013-05-08 08:45:14
您可以构建一个简单的服务器/客户端,服务器不断运行,制作和更新绘图,而客户端只传递要处理的下一个文件。
我基于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秒。
发布于 2018-07-12 16:39:49
不是对这个问题的实际回答,而是关于如何使用Python3.7和tuna (我的一个小项目)分析导入速度的提示:
python3 -X importtime -c "import scipy" 2> scipy.log
tuna scipy.log

发布于 2016-03-21 06:33:07
您可以使用imp手动导入模块。参见documentation here。
例如,import numpy as np可能会写成
import imp
np = imp.load_module("numpy",None,"/usr/lib/python2.7/dist-packages/numpy",('','',5))这将使python不必浏览整个sys.path来查找所需的包。
另请参阅:
https://stackoverflow.com/questions/16373510
复制相似问题