首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >提高Python模块导入速度

提高Python模块导入速度
EN

Stack Overflow用户
提问于 2013-05-04 18:54:54
回答 5查看 34.1K关注 0票数 43

关于如何加速Python模块导入的问题以前已经被提出(Speeding up the python "import" loaderPython -- Speed Up Imports?),但没有具体的例子,也没有产生公认的解决方案。因此,我将在这里再次讨论这个问题,但这一次是一个具体的例子。

我有一个Python脚本,它从磁盘加载一个3-D图像堆栈,对其进行平滑处理,并将其显示为电影。当我想要快速查看数据时,我从系统命令提示符调用此脚本。我可以用700ms来平滑数据,因为这可以与MATLAB相媲美。但是,导入模块需要额外的650毫秒。因此,从用户的角度来看,Python代码的运行速度减半。

这是我要导入的一系列模块:

代码语言:javascript
运行
复制
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import scipy.ndimage
import scipy.signal
import sys
import os

当然,并不是所有模块的导入速度都一样慢。罪魁祸首是:

代码语言:javascript
运行
复制
matplotlib.pyplot   [300ms]
numpy               [110ms]
scipy.signal        [200ms]

我已经尝试过使用from,但是速度并不快。由于Matplotlib是罪魁祸首,而且它以屏幕更新缓慢而闻名,所以我寻找了替代方案。一个是PyQtGraph,但它需要550ms才能导入。

我知道一个显而易见的解决方案,那就是从交互式Python会话调用我的函数,而不是从系统命令提示符调用。这很好,但它太像MATLAB了,我更喜欢在系统提示符下使用函数的优雅。

我是Python的新手,目前我不确定该如何继续。由于我是新人,我希望获得有关如何实现所提出的解决方案的链接。理想情况下,我正在寻找一个简单的解决方案(我们不都是这样吗?)因为代码需要在多台Mac和Linux机器之间移植。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-08 08:45:14

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

我基于socket模块文档中的基本示例编写了一个简单的服务器/客户端示例:http://docs.python.org/2/library/socket.html#example

下面是server.py:

代码语言:javascript
运行
复制
# 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:

代码语言:javascript
运行
复制
# 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)

您只需运行服务器:

代码语言:javascript
运行
复制
python server.py

它进行导入,然后客户端通过套接字发送要绘制的新文件的文件名:

代码语言:javascript
运行
复制
python client.py mytextfile.txt

然后服务器更新绘图。

在我的机器上,运行导入需要0.6秒,而运行client.py需要0.03秒。

票数 21
EN

Stack Overflow用户

发布于 2018-07-12 16:39:49

不是对这个问题的实际回答,而是关于如何使用Python3.7和tuna (我的一个小项目)分析导入速度的提示:

代码语言:javascript
运行
复制
python3 -X importtime -c "import scipy" 2> scipy.log
tuna scipy.log

票数 53
EN

Stack Overflow用户

发布于 2016-03-21 06:33:07

您可以使用imp手动导入模块。参见documentation here

例如,import numpy as np可能会写成

代码语言:javascript
运行
复制
import imp
np = imp.load_module("numpy",None,"/usr/lib/python2.7/dist-packages/numpy",('','',5))

这将使python不必浏览整个sys.path来查找所需的包。

另请参阅:

Manually importing gtk fails: module not found

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16373510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档