提高Python模块导入的速度

发布于 2021-01-29 17:58:55

我有一个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机器之间可移植。

关注者
0
被浏览
47
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以构建一个简单的服务器/客户端,该服务器连续运行以制作和更新绘图,而客户端仅传达下一个要处理的文件。

    我根据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.py0.03秒。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看