This is a bug. But it looks like something which might be fixed in -unstable. Could you get cython-unstable from http://hg.cython.org/ and see of there's still a problem?
Dag Sverre Seljebotn -----Original Message----- From: Tan Swee Heng <[email protected]> Date: Sunday, Sep 20, 2009 11:30 pm Subject: [Cython] Short circuit slower than nested if To: [email protected]: [email protected] Hi, I've search the archives for 'short circuit' but did not find an answer. So I am posting here. > >Consider the following code (app.pyx): > > from hashlib import sha1 > > cdef long expensive(long n, long k): > return long(sha1('%s:%s' % (n, k)).hexdigest()[:4], base) < 256 > > def test1(long n): > cdef long i, sum = 0 > for i in range(n): > if expensive(i, 0) and expensive(i, 1): # short-circuit > sum += i > print sum > > def test2(long n): > cdef long i, sum = 0 > for i in range(n): > if expensive(i, 0): # nested-if > if expensive(i, 1): > sum += i > print sum > >If this was pure Python, the performance of test1() and test2() would be the >same. However with Cython, test1() was twice as slow as test2(). > >Looking at app.c: > > // if expensive(i, 0) and expensive(i, 1): # <<<<<<<<<<<<<< > if (__pyx_f_3app_expensive(__pyx_v_i, 0)) { > __pyx_t_2 = __pyx_f_3app_expensive(__pyx_v_i, 1); > } else { > __pyx_t_2 = __pyx_f_3app_expensive(__pyx_v_i, 0); > } > >and > > // if expensive(i, 0): # <<<<<<<<<<<<<< > __pyx_t_2 = __pyx_f_3app_expensive(__pyx_v_i, 0); > if (__pyx_t_2) { > > // if expensive(i, 1): # <<<<<<<<<<<<<< > __pyx_t_2 = __pyx_f_3app_expensive(__pyx_v_i, 1); > if (__pyx_t_2) { > >For the short-circuit version, the first test is sometimes evaluated twice. >For the nested-if version, it is evaluated exactly once. > >Q: For the short-circuit, would the right behaviour be to store the result of >the first evaluation in a temporary variable instead? > >I am new to Cython so pardon me if this is not the right place to ask. If a >patch is preferred, I can give it a try although I will take some time to get >familiar with the code. > >Swee Heng >
_______________________________________________ Cython-dev mailing list [email protected] http://codespeak.net/mailman/listinfo/cython-dev
