How naive is Python?
John Machin
sjmachin at lexicon.net
Mon Jan 15 15:40:35 EST 2007
skip at pobox.com wrote:
> John> Sorry, Skip, but I find that very hard to believe. The foo()
> John> function would take quadratic time if it were merely adding on
> John> pieces of constant size -- however len(str(i)) is not a constant,
> John> it is O(log10(i)), so the time should be super-quadratic.
>
> me> Sorry, I should have pointed out that I'm using the latest version
> me> of Python. I believe += for strings has been optimized to simply
> me> extend s when there is only a single reference to it.
Sorry, I should have pointed out that you need to read up about
time.time() -- what is its resolution on your box? -- and time.clock()
and the timeit module.
>
> Actually, it isn't until I work my way back to 2.3 that I start to see
> quadratic behavior:
>
> % python2.6 strcopy.py
> 32 0.00022292137146 6.96629285812e-06
> 64 0.000907897949219 1.41859054565e-05
> 128 0.000649929046631 5.0775706768e-06
> 256 0.00111794471741 4.36697155237e-06
> 512 0.00260806083679 5.09386882186e-06
> 1024 0.00437998771667 4.27733175457e-06
> 2048 0.00921607017517 4.50003426522e-06
> 4096 0.0191979408264 4.68699727207e-06
> 8192 0.0694131851196 8.47328919917e-06
> 16384 0.0976829528809 5.96209429204e-06
> 32768 0.194766998291 5.94381708652e-06
> % python2.5 strcopy.py
> 32 0.000439167022705 1.37239694595e-05
> 64 0.000303030014038 4.73484396935e-06
> 128 0.000631809234619 4.93600964546e-06
> 256 0.00112318992615 4.38746064901e-06
> 512 0.00279307365417 5.45522198081e-06
> 1024 0.00446391105652 4.35928814113e-06
> 2048 0.00953102111816 4.65381890535e-06
> 4096 0.0198018550873 4.83443727717e-06
> 8192 0.175454854965 2.14178289752e-05
> 16384 0.103327989578 6.30663998891e-06
> 32768 0.191411972046 5.84142981097e-06
[snip]
Your ability to "see" quadratic behavoiur appears to be impaired by (1)
the low resolution and/or erratic nature of time.time() on your system
(2) stopping the experiment just before the results become interesting.
Try this with the latest *production* release (2.5):
C:\junk>cat fookount.py
def foo(kcount):
s = ''
for i in xrange(kcount) :
s += str(i) + ' '
C:\junk>for /L %n in (10,1,19) do \python25\python -mtimeit -s"from
fookount import foo" "foo(2**%n)"
C:\junk>\python25\python -mtimeit -s"from fookount import foo"
"foo(2**10)"
100 loops, best of 3: 1.1 msec per loop
C:\junk>\python25\python -mtimeit -s"from fookount import foo"
"foo(2**11)"
100 loops, best of 3: 2.34 msec per loop
C:\junk>\python25\python -mtimeit -s"from fookount import foo"
"foo(2**12)"
100 loops, best of 3: 4.79 msec per loop
C:\junk>\python25\python -mtimeit -s"from fookount import foo"
"foo(2**13)"
10 loops, best of 3: 9.57 msec per loop
C:\junk>\python25\python -mtimeit -s"from fookount import foo"
"foo(2**14)"
10 loops, best of 3: 19.8 msec per loop
C:\junk>\python25\python -mtimeit -s"from fookount import foo"
"foo(2**15)"
10 loops, best of 3: 40.7 msec per loop
C:\junk>\python25\python -mtimeit -s"from fookount import foo"
"foo(2**16)"
10 loops, best of 3: 82.1 msec per loop
C:\junk>\python25\python -mtimeit -s"from fookount import foo"
"foo(2**17)"
10 loops, best of 3: 242 msec per loop
C:\junk>\python25\python -mtimeit -s"from fookount import foo"
"foo(2**18)"
10 loops, best of 3: 886 msec per loop
C:\junk>\python25\python -mtimeit -s"from fookount import foo"
"foo(2**19)"
10 loops, best of 3: 3.21 sec per loop
Cheers,
John
More information about the Python-list
mailing list