the python x=x+x is 120 times slower than y=x+x?! why?

performance, python

Solution

When you compute `x=x+x` many thousands of times, `x` becomes a very large. You're measuring the length of time it takes to add two very large numbers.

Problem

I recently used the timeit module to do a very simple performance test of the python. The result really stunned me: the time consumed by `x=x+x` is about 125 times of `x+x` or `y=x+x,` why?! I really hope someone will give me some clue about this, maybe I used the timeit wrong? Thanks! Please notice that `y=x+x;x=y` is as slow as `x=x+x`… but the `x=x+47` is as fast as `x+x` testBasicOps() testcase="pass", time lapse:0.001487secs testcase="x=47", time lapse:0.002424secs testcase="x=94", time lapse:0.002423secs testcase="x=47*2", time lapse:0.002423secs testcase="x+x", time lapse:0.003922secs testcase="x*2", time lapse:0.005307secs testcase="x=x+x", time lapse:0.497974secs testcase="x=x*2", time lapse:0.727506secs testcase="x=x+47", time lapse:0.005770secs testcase="x=47+x", time lapse:0.004442secs testcase="x+=x", time lapse:0.498920secs testcase="y=x+x", time lapse:0.004102secs testcase="y=x*2", time lapse:0.006327secs testcase="y=x+x x=y", time lapse:0.499644secs testcase="x+x y=x", time lapse:0.004948secs testcase="x+x x=y", time lapse:0.005126secs testcase="y=10 x=y", time lapse:0.003351secs testcase="pass", time lapse:0.001487secs The code I used: ``` import timeit import numpy as npy def testBasicOps(): timeitSetup=""" x=47 y=0 """ testCases=['pass','x=47',\ 'x=94','x=47*2'\ ,'x+x','x*2'\ ,'x=x+x','x=x*2'\ ,'x=x+47','x=47+x'\ ,'x+=x','y=x+x'\ ,'y=x*2','y=x+x\nx=y'\ ,'x+x\ny=x','x+x\nx=y'\ ,'y=10\nx=y'] minT=[] tests=[] for i in testCases: tests.append(timeit.Timer(i,setup=timeitSetup)) minT.append(npy.mean(tests[-1].repeat(10,int(1e5)))) print 'testcase=\"%s\", time lapse:%fsecs'%(i,minT[-1]) def main(): print "#"*10 print "testBasicOps()" testBasicOps() if __name__ == '__main__': main() ```

Original source