有没有办法加快进口?

时间:2015-09-15 19:22:03

标签: python performance module

我有一个需要sympy的CLI应用程序。 CLI应用程序的速度很重要 - 它在用户反馈循环中使用了很多。

但是,只需执行import sympy 需要一整秒。这在紧密的反馈循环中变得异常烦人。无论如何都要预先加载'或者在没有更改模块的情况下再次运行脚本时优化模块?

3 个答案:

答案 0 :(得分:3)

显然sympy在导入时会做很多事情。它可以是内部数据结构或类似的初始化。您可以将此称为sympy库设计中的一个缺陷。

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

我认为你发现这种行为很烦人,因为你打算经常这样做。我建议不要经常这样做。实现这一目标的一种方法是创建一个只启动一次的服务器,在启动时导入sympy,然后提供一个服务(通过进程间通信),允许你做任何你想做的事情{{ 1}}。

如果这可能是你的选择,我可以详细说明如何做到这一点。

答案 1 :(得分:1)

我看一下当你运行import sympy时会发生什么,并导入所有的同情。

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

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

如果你能做到这一点会很好:

import sympy.sets

但是(正如你所指出的那样)进口同情,然后设定。

一种解决方案是编写自己的导入程序。您可以在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 sets namespace中导入sets模块?

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

答案 2 :(得分:0)

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

  

IE:

var form = document.getElementById("login-form");
     

VS

from sympy import mod1, mod2, mod3

您应该阅读以前的这些问题:

Python import X or from X import Y? (performance)

improving speed of Python module import

'import module' vs. 'from module import function'