Opened 4 years ago

Last modified 4 years ago

#22412 new defect

timeit("...") does not work inside a function

Reported by: nthiery Owned by:
Priority: major Milestone: sage-7.6
Component: misc Keywords:
Cc: Merged in:
Authors: Reviewers:
Report Upstream: N/A Work issues:
Branch: Commit:
Dependencies: Stopgaps:

Status badges


Apparently, timeit('some expression') evaluates the expression in the context of the interpreter rather than the local context where timeit is being called, which can lead to unexpected results (some students of mine got trapped today).

Let's take an example, where we time a non trivial factorization:

    sage: p = (1-x^100)
    sage: timeit('factor(p)', seconds=True)

Now, let's do the same inside a function:

    sage: def f(p):
    ....:     return timeit('factor(p)', seconds=True)
    sage: f(p)                    # That's normal
    sage: f(1)                    # OOPS, That should be instantaneous!

I am not sure there is an easy fix, but at least this limitation needs to be documented.

Change History (1)

comment:1 Changed 4 years ago by tmonteil

Note that the following seems to work:

sage: def f(p):
....:     return timeit('factor({})'.format(p), seconds=True)
sage: p = (1-x^100)
sage: f(p)
sage: f(1)

I am not sure whether what you reported should be considered as a bug however (there is some local/global context issue but i am not sure about how Python should behave in such a case).

Note: See TracTickets for help on using tickets.