Psyco performance
Paul McGuire
ptmcg at austin.rr._bogus_.com
Tue Jun 20 23:39:28 EDT 2006
<danmcleran at yahoo.com> wrote in message
news:1150839749.939196.142440 at r2g2000cwb.googlegroups.com...
> > Place all the code in a function. Even without psyco you might get
> > somewhat better performances then. And I doubt psyco can optimise code
> > that isn't in a function anyway.
> >
> > And lastly, most of the code is probably spend computing x**2 which is
> > already optimised C code.
>
> I've changed the code to include a class, method call, and function.
> Now the Psyco code is quite a bit slower. Is this a valid way to test
> Psyco's effects? When I run the following code I get this result:
>
> without psyco = 0.96840101186
> with psyco = 1.82430169197
> with psyco = 0.855900680114 slower
>
>
Here are 3 different implementations of foo, with varying degrees of
improvement.
func without with
foo1: 0.1727 0.0106
foo2: 0.1020 0.1012
foo3: 0.3632 0.8068
foo1 is just a brute force for-loop summing the values of the composed list,
foo2 calls sum(), and foo3 is the original foo using reduce().
Surprisingly, brute force + psyco beats reduce and sum without psyco.
psyco's strength is in compiling Python code inside functions. In foo2 and
foo3, most of the processing is done not in explicit Python, but in C code
implementation of sum and reduce, so the psyco processing is actually adding
more than it is optimizing.
-- Paul
import time
import psyco
time.clock()
class Test(object):
def __init__(self, value):
self.value = value
def foo1(self):
z = 0
for i in range(self.value):
z += i
return z
def foo2(self):
return sum(list(range(0,self.value)))
def foo3(self):
return reduce(lambda x,y : x + y, list(range(0,self.value)))
def test(n,f):
l = [Test(i) for i in range(1, n)]
return [f(x) for x in l]
n = 1000
fns = (Test.foo1, Test.foo2, Test.foo3)
no_psyco = []
with_psyco = []
for fn in fns:
t1 = time.clock()
l2 = test(n,fn)
t2 = time.clock()
no_psyco.append( t2 - t1 )
psyco.full()
for fn in fns:
t1 = time.clock()
l2 = test(n,fn)
t2 = time.clock()
with_psyco.append( t2 - t1 )
for fnData in zip([f.func_name for f in fns],no_psyco,with_psyco):
print "%s: %.4f %.4f" % fnData
More information about the Python-list
mailing list