Cython 是用 python 的语法写C语言，原理其实就是解释器将 python 语言翻译成C语言然后再用编译器（比如 gcc 或者 vc++ ）编译成可被 python 调用的动态链接库。是用 Cython 的好处自然就是快。最近想到一个问题，斐波那契数列可以用两种方法实现，一种是用迭代方法，即根据定义当前值等于前两个值的和。另一种是使用数列知识中的求通式法直接算出。哪种更快？

cython_generator time used: 0.000038 s 20365011074 python_loop time used: 0.000014 s 20365011074 python_math time used: 0.000059 s 20365011074.0 cython_loop time used: 0.000003 s 20365011074

python_loop_999 time used: 0.000269 s 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875 python_math_999 time used: 0.000009 s 4.34665576869e+208

#fab.pyx def fab(int max): cdef int n = 0 cdef long long a = 0 cdef long long b = 1 while n < max: yield b a, b = b, a + b n = n + 1 f = fab(1000) def fab_50(): cdef int n = 0 cdef long long a = 0 cdef long long b = 1 while n < 50: a, b = b, a + b n += 1 return b

#test.py import fab import time import math f = fab.f def print_time(fnc): def new_fnc(*arg,**kwarg): starttime = time.time() r = fnc(*arg,**kwarg) endtime = time.time() print "time used: %f s" %(endtime - starttime) return r return new_fnc @print_time def calc_by_cython(): f = fab.f for i in range(51): x=f.next() return x @print_time def calc_by_cython_50(): return fab.fab_50() @print_time def calc_by_python(x): a = 0; b = 1 for i in range(x): a,b = b, a+b return b @print_time def calc_by_math(x): sqrt_5 = math.sqrt(5) n = x+1 return 1/sqrt_5 * (((1+sqrt_5)/2)**n - ((1-sqrt_5)/2)**n) @print_time def calc_sqrt(): return math.sqrt(5) print 'cython_generator' print calc_by_cython() print 'python_loop' print calc_by_python(50) print 'python_math' print calc_by_math(50) print 'cython_loop' print calc_by_cython_50() print 'python_loop_999' print calc_by_python(999) print 'python_math_999' print calc_by_math(999)

tags: print,python,calc,long,math,return,used,cython,fab,Python,Cython,time,cdef

1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责；
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性，不作出任何保证或承若；
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。