Assignment saves time?
Steven D'Aprano
steve at REMOVE-THIS-cybersource.com.au
Fri Feb 15 20:08:33 EST 2008
On Fri, 15 Feb 2008 12:51:19 -0800, rpglover64 wrote:
> I ran it in an interactive python shell, which might have made a
> difference.
>
> import timeit
> time1=timeit.Timer('s=len(li); s==1000', 'li=range(1000)')
> time2=timeit.Timer('len(li)==1000', 'li=range(1000)')
> store=min(time1.repeat(5))
> call=min(time2.repeat(5))
> store=min(min(time1.repeat(5)),store)
> call=min(min(time2.repeat(5)),call)
> store
> 0.25531911849975586
> call
> 0.25700902938842773
>
> The difference is small enough to be insignificant, but I am curious how
> it's possible and why it happened. It's more likely a reflection of how
> I timed it than anything else, isn't it?
No. It's more likely to be a reflection of the fact that on a modern,
multitasking operating system, there are a lot of processes running, and
timings can be unpredictable because you have little control over those
other processes. In other words: it was probably a fluke.
Does your test *consistently* give you that result? Over and over again?
If so, then I would be wondering if there is some sort of weird caching
or pipelining issue in your CPU, where for some reason the first result
actually completes faster despite needing to do more work.
>>> import dis
>>> dis.dis(compile('len(li)==1000', '', 'eval'))
1 0 LOAD_NAME 0 (len)
3 LOAD_NAME 1 (li)
6 CALL_FUNCTION 1
9 LOAD_CONST 0 (1000)
12 COMPARE_OP 2 (==)
15 RETURN_VALUE
None of those ops correspond to machine instructions. There's lots of
opportunity for weird interactions between Python and the underlying
hardware. I wouldn't expect them, but nor would I discount the
possibility.
--
Steven
More information about the Python-list
mailing list