Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Import specific functions in order to reduce the startup time

The context

Let's suppose I want to create a simple script which only prints the prime factorization of the number 100. The script would look like

from sage.all import *
print(factor(100))

The problem

Executing that simple script takes a lot of time because there are plenty of modules that are expoted because of the from ... import statemnt.

I tried finding the file in which the function factor is defined and importing that specific module.

from sage.arith.misc import factor
print(factor(100))

However, this yields the following error.

Traceback (most recent call last):
  File "/home/myusername/Experiments/factor-100.py", line 1, in <module>
    from sage.arith.misc import factor
  File "/usr/lib/python3.9/site-packages/sage/arith/misc.py", line 23, in <module>
    from sage.libs.flint.arith import (bernoulli_number as flint_bernoulli,
  File "sage/libs/flint/arith.pyx", line 1, in init sage.libs.flint.arith (build/cythonized/sage/libs/flint/arith.c:5015)
  File "sage/rings/integer.pyx", line 1, in init sage.rings.integer (build/cythonized/sage/rings/integer.c:54202)
  File "sage/rings/rational.pyx", line 95, in init sage.rings.rational (build/cythonized/sage/rings/rational.c:40423)
  File "sage/rings/real_mpfr.pyx", line 1, in init sage.rings.real_mpfr (build/cythonized/sage/rings/real_mpfr.c:45462)
  File "sage/libs/mpmath/utils.pyx", line 1, in init sage.libs.mpmath.utils (build/cythonized/sage/libs/mpmath/utils.c:9058)
  File "sage/rings/complex_number.pyx", line 1, in init sage.rings.complex_number (build/cythonized/sage/rings/complex_number.c:26879)
  File "sage/rings/complex_double.pyx", line 98, in init sage.rings.complex_double (build/cythonized/sage/rings/complex_double.c:25209)
ImportError: cannot import name complex_number

I can fix this problem by adding the following import rule.

from sage.misc.all import *
from sage.arith.misc import factor
print(factor(100))

However, this also loads a lot of modules.

The question

Is it possible to import less modules than the last code block shown?