[IronPython] Slow Performance of CPython libs?

Michael Foord fuzzyman at voidspace.org.uk
Thu Feb 21 14:44:16 CET 2008


Birsch wrote:
> Thanks Michael and Dino.
>
> I'll prof and send update. Got a good profiler recommendation for .Net?
> Meanwhile I noticed the sample site below causes BeautifulSoup to 
> generate quite a few [python] exceptions during __init__. Does 
> IronPython handle exceptions significantly slower than CPtyhon?

I wouldn't make any assumptions about what is taking the time until you 
have profiled. :-)

Michael
http://www.manning.com/foord

>
> Repro code is simple (just build a BeautifulSoup obj with mininova's 
> home page).
> Here are the .py and .cs I used to time the diffs:
>
> *bstest.py:*
> #Bypass CPython default socket implementation with IPCE/FePy
> import imp, os, sys
> sys.modules['socket'] = module = imp.new_module('socket')
> execfile('socket.py', module.__dict__)
>
> from BeautifulSoup import BeautifulSoup
> from urllib import urlopen
> import datetime
>
> def getContent(url):
>     #Download html data
>     startTime = datetime.datetime.now()
>     print "Getting url", url
>     html = urlopen(url).read()
>     print "Time taken:", datetime.datetime.now() - startTime
>    
>     #Make soup
>     startTime = datetime.datetime.now()
>     print "Making soup..."
>     soup = BeautifulSoup(markup=html)
>     print "Time taken:", datetime.datetime.now() - startTime
>
> if __name__ == "__main__":
>     print getContent("www.mininova.org <http://www.mininova.org>")
>
>
> *C#:*
> using System;
> using System.Collections.Generic;
> using System.Text;
> using IronPython.Hosting;
>
> namespace IronPythonBeautifulSoupTest
> {
>     public class Program
>     {
>         public static void Main(string[] args)
>         {
>             //Init
>             System.Console.WriteLine("Starting...");
>             DateTime start = DateTime.Now;
>             PythonEngine engine = new PythonEngine();
>
>             //Add paths:
>             //BeautifulSoup.py, socket.py, bstest.py located on exe dir
>             engine.AddToPath(@".");
>             //CPython Lib (replace with your own)
>             engine.AddToPath(@"D:\Dev\Python\Lib");
>
>             //Import and load
>             TimeSpan span = DateTime.Now - start;
>             System.Console.WriteLine("[1] Import: " + span.TotalSeconds);
>             DateTime d = DateTime.Now;
>             engine.ExecuteFile(@"bstest.py");
>             span = DateTime.Now - d;
>             System.Console.WriteLine("[2] Load: " + span.TotalSeconds);
>
>             //Execute
>             d = DateTime.Now;
>             engine.Execute("getContent(\"http://www.mininova.org\ 
> <http://www.mininova.org%5C>")");
>             span = DateTime.Now - d;
>             System.Console.WriteLine("[3] Execute: " + span.TotalSeconds);
>             span = DateTime.Now - start;
>             System.Console.WriteLine("Total: " + span.TotalSeconds);
>         }
>     }
> }
>
>
>
> On Wed, Feb 20, 2008 at 6:57 PM, Dino Viehland 
> <dinov at exchange.microsoft.com <mailto:dinov at exchange.microsoft.com>> 
> wrote:
>
>     We've actually had this issue reported once before a long time ago
>     - it's a very low CodePlex ID -
>     http://www.codeplex.com/IronPython/WorkItem/View.aspx?WorkItemId=651
>
>     We haven't had a chance to investigate the end-to-end scenario.
>      If someone could come up with a smaller simpler repro that'd be
>     great.  Otherwise we haven't forgotten about it we've just had
>     more immediately pressing issues to work on :(.
>
>     -----Original Message-----
>     From: users-bounces at lists.ironpython.com
>     <mailto:users-bounces at lists.ironpython.com>
>     [mailto:users-bounces at lists.ironpython.com
>     <mailto:users-bounces at lists.ironpython.com>] On Behalf Of Michael
>     Foord
>     Sent: Wednesday, February 20, 2008 5:20 AM
>     To: Discussion of IronPython
>     Subject: Re: [IronPython] Slow Performance of CPython libs?
>
>     Birsch wrote:
>     > Hi - We've been using IronPython successfully to allow extensibility
>     > of our application.
>     >
>     > Overall we are happy with the performance, with the exception of
>     > BeautifulSoup which seems to run very slowly: x5 or more time to
>     > execute compared to CPython.
>     >
>     > Most of the time seems to be spent during __init__() of BS,
>     where the
>     > markup is parsed.
>     >
>     > We suspect this has to do with the fact that our CPython env is
>     > executing .pyc files and can precompile its libs, while the
>     IronPython
>     > environment compiles each iteration. We couldn't find a way to
>     > pre-compile the libs and then introduce them into the code, but
>     in any
>     > case this will result in a large management overhead since the
>     amount
>     > of CPython libs we expose to our users contains 100's of modules.
>     >
>     > Any ideas on how to optimize?
>
>     I think it is worth doing real profiling to find out where the time is
>     being spent during parsing.
>
>     If it is spending most of the time in '__init__' then the time is
>     probably not spent in importing - so compilation isn't relevant and it
>     is a runtime performance issue. (Importing is much slower with
>     IronPython and at Resolver Systems we do use precompiled binaries
>     - but
>     strangely enough it doesn't provide much of a performance gain.)
>
>     Michael
>     http://www.manning.com/foord
>
>     >
>     > Thanks,
>     > -Birsch
>     >
>     > Note: we're using FePy/IPCE libs with regular IP v1.1.1 runtime DLLs
>     > (this was done to overcome library incompatibilities and network
>     > errors). However, the relevant slow .py code (mainly SGMLParser and
>     > BeautifulSoup) is the same.
>     >
>     ------------------------------------------------------------------------
>     >
>     > _______________________________________________
>     > Users mailing list
>     > Users at lists.ironpython.com <mailto:Users at lists.ironpython.com>
>     > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>     >
>
>     _______________________________________________
>     Users mailing list
>     Users at lists.ironpython.com <mailto:Users at lists.ironpython.com>
>     http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>     _______________________________________________
>     Users mailing list
>     Users at lists.ironpython.com <mailto:Users at lists.ironpython.com>
>     http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>   




More information about the Ironpython-users mailing list