Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法加快进口速度?_Python_Performance_Module - Fatal编程技术网

Python 有没有办法加快进口速度?

Python 有没有办法加快进口速度?,python,performance,module,Python,Performance,Module,我有一个CLI应用程序需要sympy。CLI应用程序的速度很重要—它在用户反馈循环中被大量使用 但是,只需执行导入sympy需要整整一秒钟。在一个紧密的反馈循环中,这会让人非常恼火。当脚本再次运行而不更改模块时,是否还有“预加载”或优化模块的方法?显然sympy在导入时起了很大作用。它可以是内部数据结构的初始化或类似操作。您可以将此称为sympy库设计中的缺陷 在这种情况下,您唯一的选择是避免重做此初始化 我认为你觉得这种行为很烦人,因为你打算经常这样做。我建议避免经常这样做。实现这一点的一种方

我有一个CLI应用程序需要
sympy
。CLI应用程序的速度很重要—它在用户反馈循环中被大量使用


但是,只需执行导入sympy需要整整一秒钟。在一个紧密的反馈循环中,这会让人非常恼火。当脚本再次运行而不更改模块时,是否还有“预加载”或优化模块的方法?

显然
sympy
在导入时起了很大作用。它可以是内部数据结构的初始化或类似操作。您可以将此称为
sympy
库设计中的缺陷

在这种情况下,您唯一的选择是避免重做此初始化

我认为你觉得这种行为很烦人,因为你打算经常这样做。我建议避免经常这样做。实现这一点的一种方法是创建一个只启动一次的服务器,在启动时导入
symphy
,然后提供一个服务(通过进程间通信),允许您使用
symphy
执行任何操作


如果您可以选择此选项,我可以详细说明如何执行此操作。

您应该测试是否仅导入代码中使用的模块可以缩短加载时间

即:

vs

import sympy
您应该阅读前面的问题:


我查看了运行import Symphy时会发生什么,它会导入所有Symphy

https://github.com/sympy/sympy/blob/master/sympy/__init__.py

如果您只使用Symphy的某些部分,则只导入您需要的部分

如果你能做到这一点,那就太好了:

import sympy.sets
但是(正如您所指出的)导入sympy然后设置

一个解决方案是编写自己的导入程序。您可以在imp模块的帮助下完成此操作

import imp
sets = imp.load_module("sets", open("sympy/sets/__init__.py"), "sympy/sets/__init__.py", ('.py', 'U', 1))
但是,即使这样也可能不够优化。看看
sympy/sets/_init__.py
我发现它是这样做的:

from .sets import (Set, Interval, Union, EmptySet, FiniteSet, ProductSet,
    Intersection, imageset, Complement, SymmetricDifference)
from .fancysets import TransformationSet, ImageSet, Range, ComplexRegion
from .contains import Contains
from .conditionset import ConditionSet
也许您只能从simpy集合名称空间导入集合模块

import imp
sets = imp.load_module("sets", open("sympy/sets/set.py") "sympy/sets/set.py", ('.py', 'U', 1))

似乎
sympy
dev已经意识到了这个问题。在提到缓慢的进口时,有很多评论。也许再提出一个问题?(在确保使用的是最新版本后)重写CLI应用程序,以便只运行一次,同时向其提供多个不同的输入…?@twalberg此时它不再是CLI应用程序。更具体地说,我的应用程序是一个语言解释器。现在带有
importtime
的Python 3.7已经推出,我已经开始发布了一个新的sympy版本()。我已经在做了,这完全没有什么区别。我觉得这太过工程化了,而且跨平台开发相当脆弱。是否无法“快照”解释器状态(导入后),并从磁盘加载整个解释器状态?据我所知,没有。顺便说一句,在我几年前的笔记本电脑上,导入
sympy
“从磁盘加载整个解释器状态”只需要几秒钟的时间,这只是无法正常工作的几个原因之一。@Alfe我很想找出原因,看看我能否以某种方式重现它。我可以邀请你加入吗?你的旧笔记本电脑有SSD吗?很遗憾,这根本不起作用,因为只有
import sympy.set
才能运行
sympy/\uu init\uuuuuuuuuy.py
,导入所有内容。
import imp
sets = imp.load_module("sets", open("sympy/sets/set.py") "sympy/sets/set.py", ('.py', 'U', 1))