2013/3/3 Zaur Shibzukhov <szp...@gmail.com>: > 2013/3/3 Zaur Shibzukhov <szp...@gmail.com>: >> 2013/3/3 Zaur Shibzukhov <szp...@gmail.com>: >>> 2013/3/2 Stefan Behnel <stefan...@behnel.de>: >>>> Hi, >>>> >>>> the last pull request looks good to me now. >>>> >>>> https://github.com/cython/cython/pull/189 >>>> >>>> Any more comments on it? >>> >>> As was suggested earlier, I added `import_datetime` inline function to >>> initialize PyDateTime C API instead of direct usage of "non-native" C >>> macros from datetime.h. >>> Now you call `import_array ()` first in the same way as is done with >>> `numpy`. >>> This approach looks natural in the light of experience with numpy. >>> >> I make some performance comparisons. Here example for dates. >> >> # test_date.pyx >> -------------------- >> >> Here test code: >> >> from cpython.datetime cimport import_datetime, date_new, date >> >> import_datetime() >> >> from datetime import date as pydate >> >> def test_date1(): >> cdef list lst = [] >> for year in range(1000, 2001): >> for month in range(1,13): >> for day in range(1, 20): >> d = pydate(year, month, day) >> lst.append(d) >> return lst >> >> >> def test_date2(): >> cdef list lst = [] >> for year in range(1000, 2001): >> for month in range(1,13): >> for day in range(1, 20): >> d = date(year, month, day) >> lst.append(d) >> return lst >> >> def test_date3(): >> cdef list lst = [] >> cdef int year, month, day >> for year in range(1000, 2001): >> for month in range(1,13): >> for day in range(1, 20): >> d = date_new(year, month, day) >> lst.append(d) >> return lst >> >> def test1(): >> l = test_date1() >> return l >> >> def test2(): >> l = test_date2() >> return l >> >> def test3(): >> l = test_date3() >> return l >> >> Here are timings: >> >> (py32)zbook:mytests $ python -m timeit -n 50 -r 5 -s "from >> mytests.test_date import test1" "test1()" >> 50 loops, best of 5: 83.2 msec per loop >> (py32)zbook:mytests $ python -m timeit -n 50 -r 5 -s "from >> mytests.test_date import test2" "test2()" >> 50 loops, best of 5: 74.7 msec per loop >> (py32)zbook:mytests $ python -m timeit -n 50 -r 5 -s "from >> mytests.test_date import test3" "test3()" >> 50 loops, best of 5: 20.9 msec per loop >> >> OSX 10.6.8 64 bit python 3.2 >> > > More acurate test... > > # coding: utf-8 > > from cpython.datetime cimport import_datetime, date_new, date > > import_datetime() > > from datetime import date as pydate > > def test_date1(): > cdef list lst = [] > cdef int year, month, day > for year in range(1000, 2001): > for month in range(1,13): > for day in range(1, 20): > d = pydate(year, month, day) > lst.append(d) > return lst > > > def test_date2(): > cdef list lst = [] > cdef int year, month, day > for year in range(1000, 2001): > for month in range(1,13): > for day in range(1, 20): > d = date(year, month, day) > lst.append(d) > return lst > > def test_date3(): > cdef list lst = [] > cdef int year, month, day > for year in range(1000, 2001): > for month in range(1,13): > for day in range(1, 20): > d = date_new(year, month, day) > lst.append(d) > return lst > > def test1(): > l = test_date1() > return l > > def test2(): > l = test_date2() > return l > > def test3(): > l = test_date3() > return l > > Timings: > > (py32)zbook:mytests $ python -m timeit -n 50 -r 5 -s "from > mytests.test_date import test1" "test1()" > 50 loops, best of 5: 83.3 msec per loop > (py32)zbook:mytests $ python -m timeit -n 50 -r 5 -s "from > mytests.test_date import test2" "test2()" > 50 loops, best of 5: 74.6 msec per loop > (py32)zbook:mytests $ python -m timeit -n 50 -r 5 -s "from > mytests.test_date import test3" "test3()" > 50 loops, best of 5: 20.8 msec per loop
Yet another performance comparison for `time`: # coding: utf-8 from cpython.datetime cimport import_datetime, time_new, time import_datetime() from datetime import time as pytime def test_time1(): cdef list lst = [] cdef int hour, minute, second, microsecond for hour in range(0, 24): for minute in range(0,60): for second in range(0, 60): for microsecond in range(0, 100000, 50000): d = pytime(hour, minute, second, microsecond) lst.append(d) return lst def test_time2(): cdef list lst = [] cdef int hour, minute, second, microsecond for hour in range(0, 24): for minute in range(0,60): for second in range(0, 60): for microsecond in range(0, 100000, 50000): d = time(hour, minute, second, microsecond) lst.append(d) return lst def test_time3(): cdef list lst = [] cdef int hour, minute, second, microsecond for hour in range(0, 24): for minute in range(0,60): for second in range(0, 60): for microsecond in range(0, 100000, 50000): d = time_new(hour, minute, second, microsecond, None) lst.append(d) return lst def test1(): l = test_time1() return l def test2(): l = test_time2() return l def test3(): l = test_time3() return l Timings: (py32)zbook:mytests $ python -m timeit -n 50 -r 5 -s "from mytests.test_time import test1" "test1()" 50 loops, best of 5: 72.2 msec per loop (py32)zbook:mytests $ python -m timeit -n 50 -r 5 -s "from mytests.test_time import test2" "test2()" 50 loops, best of 5: 64.7 msec per loop (py32)zbook:mytests $ python -m timeit -n 50 -r 5 -s "from mytests.test_time import test3" "test3()" 50 loops, best of 5: 13 msec per loop Sure the same kind of results might expect for `datetime` too. Shibzukhov Zaur _______________________________________________ cython-devel mailing list cython-devel@python.org http://mail.python.org/mailman/listinfo/cython-devel