See also www.dabeaz.com/python/GIL.pdf.

richard@araminta:~$ cat t1
#! /usr/bin/python

def count(n):
    while n > 0:
        n -= 1

count(100000000)
count(100000000)
richard@araminta:~$ cat t2
#! /usr/bin/python
from threading import Thread

def count(n):
    while n > 0:
        n -= 1

t1 = Thread(target=count,args=(100000000,))
t1.start()
t2 = Thread(target=count,args=(100000000,))
t2.start()
t1.join(); t2.join()
richard@araminta:~$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 15
model name      : Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz
stepping        : 11
cpu MHz         : 2397.660
cache size      : 4096 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 10
wp              : yes
flags           : fpu de tsc msr pae cx8 apic sep mtrr cmov pat clflush acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good pni ssse3 cx16 lahf_lm
bogomips        : 4797.58
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 15
model name      : Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz
stepping        : 11
cpu MHz         : 2397.660
cache size      : 4096 KB
physical id     : 0
siblings        : 1
core id         : 2
cpu cores       : 1
apicid          : 2
initial apicid  : 2
fpu             : yes
fpu_exception   : yes
cpuid level     : 10
wp              : yes
flags           : fpu de tsc msr pae cx8 apic sep mtrr cmov pat clflush acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good pni ssse3 cx16 lahf_lm
bogomips        : 4797.58
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor       : 2
vendor_id       : GenuineIntel
cpu family      : 6
model           : 15
model name      : Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz
stepping        : 11
cpu MHz         : 2397.660
cache size      : 4096 KB
physical id     : 0
siblings        : 1
core id         : 1
cpu cores       : 1
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 10
wp              : yes
flags           : fpu de tsc msr pae cx8 apic sep mtrr cmov pat clflush acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good pni ssse3 cx16 lahf_lm
bogomips        : 4797.58
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

processor       : 3
vendor_id       : GenuineIntel
cpu family      : 6
model           : 15
model name      : Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz
stepping        : 11
cpu MHz         : 2397.660
cache size      : 4096 KB
physical id     : 0
siblings        : 1
core id         : 3
cpu cores       : 1
apicid          : 3
initial apicid  : 3
fpu             : yes
fpu_exception   : yes
cpuid level     : 10
wp              : yes
flags           : fpu de tsc msr pae cx8 apic sep mtrr cmov pat clflush acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good pni ssse3 cx16 lahf_lm
bogomips        : 4797.58
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

richard@araminta:~$ python -V
Python 2.5.2
richard@araminta:~$ uname -a
Linux araminta 2.6.26-2-xen-amd64 #1 SMP Wed Mar 10 00:29:48 UTC 2010 x86_64 GNU/Linux
richard@araminta:~$ time ./t1; time ./t1; time ./t1; time ./t2; time ./t2; time ./t2

real    0m16.525s
user    0m16.517s
sys     0m0.008s

real    0m16.549s
user    0m16.541s
sys     0m0.004s

real    0m16.522s
user    0m16.513s
sys     0m0.008s

real    0m41.883s
user    0m8.657s
sys     0m4.932s

real    0m38.345s
user    0m9.549s
sys     0m5.120s

real    0m41.051s
user    0m8.933s
sys     0m4.984s
richard@araminta:~$ /usr/local/python-3.1/bin/python3.1 -V
Python 3.1.2
richard@araminta:~$ for x in t{1,1,1,2,2,2}; do time /usr/local/python-3.1/bin/python3.1 $x; done

real    0m23.810s
user    0m23.805s
sys     0m0.004s

real    0m23.754s
user    0m23.741s
sys     0m0.008s

real    0m23.784s
user    0m23.781s
sys     0m0.000s

real    0m44.770s
user    0m25.510s
sys     0m12.529s

real    0m46.439s
user    0m24.098s
sys     0m13.977s

real    0m50.376s
user    0m24.926s
sys     0m15.553s




richard@sfere:~$ cat /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 6
model           : 10
model name      : AMD Athlon(tm) XP 3200+
stepping        : 0
cpu MHz         : 2209.997
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse syscall mmxext 3dnowext 3dnow up
bogomips        : 4424.81
clflush size    : 32
power management: ts

richard@sfere:~$ time ./t1; time ./t1; time ./t1; time ./t2; time ./t2; time ./t2

real    0m41.767s
user    0m41.411s
sys     0m0.012s

real    0m41.839s
user    0m41.523s
sys     0m0.004s

real    0m42.203s
user    0m41.859s
sys     0m0.016s

real    0m42.763s
user    0m42.219s
sys     0m0.152s

real    0m42.748s
user    0m42.151s
sys     0m0.204s

real    0m42.825s
user    0m42.191s
sys     0m0.188s