提高Python模块导入的速度

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.py0.03秒.


phi*_*294 5

您可以使用手动导入模块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中找到所需的软件包。

也可以看看:

手动导入gtk失败:找不到模块