[pypy-issue] [issue1477] datetime issues in CPython vs PyPy

Jim Kelly tracker at bugs.pypy.org
Tue May 7 02:19:14 CEST 2013


New submission from Jim Kelly <pthread1981 at gmail.com>:

So I had mentioned on twitter that I was seeing that CPython was significantly 
faster than PyPy in some performance testing I was doing.  Essentially I was just 
pushing data as fast as possible through this app to get a sense of its throughput 
limits.  Romain Guillebert requested I file a bug.

I tracked this down a bit, and it seems to me the issue was actually the 
scaffolding around my tests.  I basically had a set of sample data and was runnign 
a while look for a set period of time using datetime, then randomly selected 
sample data and ran it through my program, rinse, repeat.

At any rate, looking at CProfile, it seems that datetime calls are taking a long 
time to execute.  I tried this both on 1.9 and 2.0beta2, and this is in comparison 
to CPython 2.7.2.  I've attached the simple test case I created.  You'll note the 
"datetime.datetime.now() < (startTime + datetime.timedelta(minutes=2))" call is no 
longer part of the while loop, so as to make it more apparent what was running 
longer, while still executing it.  

Here are the various results.  As you can see 2 beta2 is substantially faster than 
1.9, but both are slower than CPython.  Thanks!

CPython 2.7.2:
         1000003 function calls in 4.818 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    2.878    2.878    4.818    4.818 mytest.py:6(TestFunc)
  1000001    1.940    0.000    1.940    0.000 {built-in method now}
        1    0.000    0.000    0.000    0.000 {method 'disable' of 
'_lsprof.Profiler' objects}

PyPy 1.9:
         87000029 function calls in 179.627 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.489    0.489  179.627  179.627 mytest.py:6(TestFunc)
  1000001    1.039    0.000   79.641    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:1543(now)
  1000001    4.021    0.000   77.711    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:1492(fromtimestamp)
  1000000   44.124    0.000   69.953    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:446(__new__)
  2000001    5.676    0.000   48.972    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:1445(__new__)
  1000001    5.792    0.000   44.650    0.000 {time.localtime}
  1000001   30.022    0.000   38.858    0.000 /Users/pypy/buildslave/pypy-c-jit-
macosx-x86-64/build/lib_pypy/_structseq.py:71(structseq_new)
  2000001   27.699    0.000   38.829    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:759(__new__)
  1000000    1.181    0.000   26.775    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:1838(__add__)
 33000008   16.083    0.000   16.083    0.000 {isinstance}
  3000001   10.666    0.000   10.666    0.000 {method '__new__' of 'type' objects}
  9000000    5.756    0.000    5.756    0.000 {abs}
  1000001    5.087    0.000    5.087    0.000 {method '__setattr__' of 'object' 
objects}
  6000000    4.154    0.000    4.154    0.000 {divmod}
  2000001    2.753    0.000    4.092    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:285(_check_time_fields)
  2000001    3.785    0.000    3.785    0.000 {round}
  1000001    3.431    0.000    3.431    0.000 {method '__new__' of 
'_structseq.structseqtype' objects}
  1000000    0.516    0.000    2.769    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:1783(__lt__)
  2000001    1.699    0.000    2.424    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:273(_check_date_fields)
  1000000    0.647    0.000    2.065    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:1807(_cmp)
  1000001    2.009    0.000    2.009    0.000 {min}
  1000000    1.219    0.000    1.219    0.000 {cmp}
  1000001    0.891    0.000    0.891    0.000 {time.time}
  1000000    0.403    0.000    0.624    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:345(__init__)
  2000002    0.318    0.000    0.318    0.000 {len}
  3000001    0.048    0.000    0.048    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:56(_days_in_month)
  3000002    0.043    0.000    0.043    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:298(_check_tzinfo_arg)
  1000000    0.020    0.000    0.020    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:594(seconds)
  1000000    0.020    0.000    0.020    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:599(microseconds)
  1000000    0.019    0.000    0.019    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:589(days)
  1000000    0.019    0.000    0.019    0.000 
/usr/local/Cellar/pypy/1.9/lib_pypy/datetime.py:957(_checkOverflow)
        1    0.000    0.000    0.000    0.000 {method 'disable' of 
'_lsprof.Profiler' objects}

PyPy 2 beta2:
         100000037 function calls in 97.047 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.355    0.355   97.047   97.047 mytest.py:6(TestFunc)
  1000000   42.643    0.000   67.528    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:436(__new__)
  1000001    0.878    0.000   18.800    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:1534(now)
  1000001    1.575    0.000   17.231    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:1489(fromtimestamp)
 32000008   15.039    0.000   15.039    0.000 {isinstance}
  2000001    4.595    0.000   13.873    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:1441(__new__)
  1000000    1.085    0.000    9.230    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:1841(__add__)
  1000001    2.137    0.000    7.435    0.000 {time.localtime}
 14000007    3.853    0.000    6.044    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:272(_check_int_field)
  1000001    3.542    0.000    5.297    0.000 /Users/pypy/buildslave/pypy-c-jit-
macosx-x86-64/build/lib_pypy/_structseq.py:70(structseq_new)
  8000000    4.659    0.000    4.659    0.000 {abs}
  2000001    1.071    0.000    4.527    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:300(_check_time_fields)
  7000001    4.163    0.000    4.163    0.000 {divmod}
  3000001    3.951    0.000    3.951    0.000 {method '__new__' of 'type' objects}
  2000001    0.389    0.000    3.012    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:287(_check_date_fields)
  2000001    2.525    0.000    2.960    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:27(_round)
  1000000    0.349    0.000    1.133    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:1787(__lt__)
  1000001    0.777    0.000    0.777    0.000 {method '__new__' of 
'_structseq.structseqtype' objects}
  1000001    0.699    0.000    0.699    0.000 {method '__setattr__' of 'object' 
objects}
  1000001    0.692    0.000    0.692    0.000 {time.time}
  1000000    0.381    0.000    0.614    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:360(__init__)
  1000000    0.378    0.000    0.559    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:1811(_cmp)
  2000001    0.435    0.000    0.435    0.000 {math.floor}
  1000001    0.404    0.000    0.404    0.000 {min}
  2000002    0.280    0.000    0.280    0.000 {len}
  3000001    0.055    0.000    0.055    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:61(_days_in_month)
  3000002    0.038    0.000    0.038    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:315(_check_tzinfo_arg)
  1000000    0.024    0.000    0.024    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:24(_cmp)
  1000000    0.020    0.000    0.020    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:575(seconds)
  1000000    0.018    0.000    0.018    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:946(_checkOverflow)
  1000000    0.018    0.000    0.018    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:580(microseconds)
  1000000    0.017    0.000    0.017    0.000 /usr/local/pypy-2.0-
beta2/lib_pypy/datetime.py:570(days)
        1    0.000    0.000    0.000    0.000 {method 'disable' of 
'_lsprof.Profiler' objects}

----------
files: mytest.py
messages: 5674
nosy: jkelly, pypy-issue
priority: performance bug
release: 2.0
status: unread
title: datetime issues in CPython vs PyPy

________________________________________
PyPy bug tracker <tracker at bugs.pypy.org>
<https://bugs.pypy.org/issue1477>
________________________________________


More information about the pypy-issue mailing list