RAA*_*AAC 34 python import performance module
之前已经问过如何加速导入Python模块的问题(加速python"import"加载器和Python - 加速进口?)但是没有具体的例子并且没有产生可接受的解决方案.因此,我将在这里再次讨论这个问题,但这次是一个具体的例子.
我有一个Python脚本,从磁盘加载三维图像堆栈,平滑它,并将其显示为电影.当我想快速查看我的数据时,我从系统命令提示符调用此脚本.我可以用700毫秒来平滑数据,因为这与MATLAB相当.但是,导入模块需要额外的650 ms.因此,从用户的角度来看,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
Run Code Online (Sandbox Code Playgroud)
当然,并非所有模块的导入速度都相同.罪魁祸首是:
matplotlib.pyplot [300ms]
numpy [110ms]
scipy.signal [200ms]
Run Code Online (Sandbox Code Playgroud)
我已经尝试过使用from
,但这并不快.由于Matplotlib是主要的罪魁祸首,它因缓慢的屏幕更新而闻名,我寻找替代方案.一个是PyQtGraph,但导入需要550毫秒.
我知道一个明显的解决方案,即从交互式Python会话而不是系统命令提示符调用我的函数.这很好但是它太像MATLAB了,我更喜欢从系统提示中获得我的功能的优雅.
我是Python的新手,我不知道如何继续这一点.由于我是新手,我很欣赏有关如何实施建议解决方案的链接.理想情况下,我正在寻找一个简单的解决方案(不是我们所有人!),因为代码需要在多台Mac和Linux机器之间移植.
Nic*_*mer 19
这个问题不是实际的答案,而是有关如何使用Python 3.7和tuna(我的一个小项目)来描述导入速度的提示:
python3.7 -X importtime -c "import scipy" 2> scipy.log
tuna scipy.log
Run Code Online (Sandbox Code Playgroud)
And*_*nca 15
你可以构建一个简单的服务器/客户端,服务器不断运行并更新绘图,客户端只是传递下一个要处理的文件.
我根据socket
模块docs 的基本示例编写了一个简单的服务器/客户端示例: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()
Run Code Online (Sandbox Code Playgroud)
和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)
Run Code Online (Sandbox Code Playgroud)
你只需运行服务器:
python server.py
Run Code Online (Sandbox Code Playgroud)
进行导入,然后客户端只通过套接字发送新文件的文件名来绘图:
python client.py mytextfile.txt
Run Code Online (Sandbox Code Playgroud)
然后服务器更新图.
在我的机器上运行你的导入需要0.6秒,同时运行client.py
0.03秒.
您可以使用手动导入模块imp
。请参阅此处的文档。
例如,import numpy as np
可能写成
import imp
np = imp.load_module("numpy",None,"/usr/lib/python2.7/dist-packages/numpy",('','',5))
Run Code Online (Sandbox Code Playgroud)
这将使python从整个浏览过程sys.path
中找到所需的软件包。
也可以看看:
归档时间: |
|
查看次数: |
18839 次 |
最近记录: |